Mengkueri kontainer Azure Cosmos DB

BERLAKU UNTUK: NoSQL

Artikel ini menjelaskan cara mengkueri kontainer (koleksi, grafik, atau tabel) di Azure Cosmos DB. Secara khusus, ini mencakup cara kerja kueri dalam partisi dalam dan lintas partisi di Azure Cosmos DB.

Kueri dalam partisi

Saat Anda meminta data dari kontainer, jika kueri memiliki filter kunci partisi yang ditentukan, Azure Cosmos DB secara otomatis mengoptimalkan kueri. Ini merutekan kueri ke partisi fisik yang sesuai dengan nilai kunci partisi yang ditentukan dalam filter.

Misalnya, pertimbangkan kueri di bawah ini dengan filter kesetaraan pada DeviceId. Jika kita menjalankan kueri ini pada kontainer yang dipartisi pada DeviceId, kueri ini memfilter ke satu partisi fisik.

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'

Seperti contoh sebelumnya, kueri ini juga memfilter ke satu partisi. Menambahkan filter pada Location tidak mengubah kueri berikut:

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'

Berikut adalah kueri yang memiliki filter rentang pada kunci partisi dan tidak akan dicakup ke partisi fisik tunggal. Agar menjadi kueri dalam partisi, kueri harus memiliki filter kesetaraan yang menyertakan kunci partisi:

SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'

Kueri lintas partisi

Kueri berikut ini tidak memiliki filter pada kunci partisi (DeviceId). Oleh karena itu, ia harus melakukan fan out ke semua partisi fisik di mana ia dijalankan terhadap indeks setiap partisi:

SELECT * FROM c WHERE c.Location = 'Seattle`

Setiap partisi fisik memiliki indeks sendiri. Oleh karena itu, saat Anda menjalankan kueri lintas partisi pada kontainer, Anda secara efektif menjalankan satu kueri per partisi fisik. Azure Cosmos DB secara otomatis menggabungkan hasil di berbagai partisi fisik.

Indeks dalam partisi fisik yang berbeda independen satu sama lain. Tidak ada indeks global di Azure Cosmos DB.

Kueri lintas partisi paralel

Azure Cosmos DB SDKs 1.9.0 dan yang lebih baru mendukung opsi eksekusi kueri paralel. Kueri lintas partisi paralel memungkinkan Anda untuk melakukan kueri latensi rendah dan lintas partisi.

Anda bisa mengelola eksekusi kueri paralel dengan menyetel parameter berikut:

  • MaxConcurrency: Mengatur jumlah maksimum koneksi jaringan simultan ke partisi kontainer. Jika Anda mengatur properti ini ke -1, SDK mengelola tingkat paralelisme. MaxConcurrency Jika diatur ke 0, ada satu koneksi jaringan ke partisi kontainer.

  • MaxBufferedItemCount: Menukar latensi kueri versus penggunaan memori sisi klien. Jika opsi ini dihilangkan atau diatur ke -1, SDK mengelola jumlah item yang dibuffer selama eksekusi kueri paralel.

Karena kemampuan Azure Cosmos DB untuk menyejajarkan kueri lintas partisi, latensi kueri umumnya menskalakan serta sistem menambahkan partisi fisik. Namun, biaya RU meningkat secara signifikan karena jumlah total partisi fisik meningkat.

Saat Anda menjalankan kueri lintas partisi, Anda pada dasarnya melakukan kueri terpisah per partisi fisik individual. Meskipun kueri lintas partisi menggunakan indeks, jika tersedia, kueri tersebut masih tidak seefisien kueri dalam partisi.

Contoh bermanfaat

Berikut adalah analogi untuk menjelaskan kueri lintas partisi dengan lebih baik:

Bayangkan Anda adalah pengemudi pengiriman yang harus mengirimkan paket ke kompleks apartemen yang berbeda. Setiap kompleks apartemen memiliki daftar di tempat yang memiliki semua nomor unit penghuni. Kita dapat membandingkan setiap kompleks apartemen dengan partisi fisik dan setiap daftar dengan indeks partisi fisik.

Kita dapat membandingkan kueri dalam partisi dan lintas partisi menggunakan contoh ini:

Kueri dalam partisi (contoh)

Jika pengemudi pengiriman mengetahui kompleks apartemen yang benar (partisi fisik), ia dapat segera berkendara ke gedung yang benar. Pengemudi dapat memeriksa daftar nomor unit penghuni kompleks apartemen (indeks) dan dengan cepat mengirimkan paket yang sesuai. Dalam hal ini, pengemudi tidak membuang-buang waktu atau berusaha mengemudi ke kompleks apartemen untuk memeriksa dan melihat apakah ada penerima paket yang tinggal di sana.

Kueri lintas partisi (penyebaran)

Jika pengemudi pengiriman tidak tahu kompleks apartemen yang benar (partisi fisik), mereka perlu berkendara ke setiap gedung apartemen dan memeriksa daftar dengan semua nomor unit penghuni (indeks). Setelah pengemudi tiba di setiap kompleks apartemen, mereka masih dapat menggunakan daftar alamat setiap penghuni. Namun, mereka perlu memeriksa setiap daftar kompleks apartemen, apakah ada penerima paket yang tinggal di sana atau tidak. Contoh ini adalah cara kerja kueri lintas partisi. Meskipun mereka dapat menggunakan indeks (artinya, mereka tidak perlu mengetuk setiap pintu), mereka harus secara terpisah memeriksa indeks untuk setiap partisi fisik.

Kueri lintas partisi (dicakup hanya untuk beberapa partisi fisik)

Jika pengemudi pengiriman tahu bahwa semua penerima paket tinggal dalam beberapa kompleks apartemen tertentu, mereka tidak perlu mengemudi ke setiap satu. Saat mengemudi ke beberapa kompleks apartemen masih membutuhkan lebih banyak pekerjaan daripada mengunjungi hanya satu bangunan, pengemudi pengiriman masih menghemat waktu dan upaya yang signifikan. Jika kueri memiliki kunci partisi dalam filternya dengan IN kata kunci, kueri hanya memeriksa indeks partisi fisik yang relevan untuk data.

Hindari kueri lintas partisi

Untuk sebagian besar kontainer, memiliki beberapa kueri lintas partisi tidak dapat dihindari, yang baik-baik saja! Hampir semua operasi kueri didukung di seluruh partisi, baik untuk kunci partisi logis maupun partisi fisik. Azure Cosmos DB juga memiliki banyak pengoptimalan di mesin kueri dan SDK klien untuk menyejajarkan eksekusi kueri di seluruh partisi fisik.

Untuk sebagian besar skenario baca-berat, sebaiknya pilih properti yang paling umum di filter kueri Anda. Anda juga harus memastikan kunci partisi Anda mengikuti praktik terbaik pemilihan kunci partisi lainnya.

Menghindari kueri lintas partisi biasanya hanya penting untuk kontainer besar. Anda dikenakan biaya minimal sekitar 2,5 RU setiap kali Anda memeriksa indeks partisi fisik untuk hasil bahkan jika tidak ada item dalam partisi fisik yang cocok dengan filter kueri. Dengan demikian, jika Anda hanya memiliki satu (atau hanya beberapa) partisi fisik, kueri lintas partisi tidak mengonsumsi secara signifikan lebih banyak RU daripada kueri dalam partisi.

Jumlah partisi fisik terkait dengan jumlah RU yang disediakan. Setiap partisi fisik memungkinkan hingga 10.000 RU yang disediakan dan dapat menyimpan hingga 50 GB data. Azure Cosmos DB secara otomatis mengelola partisi fisik untuk Anda. Jumlah partisi fisik dalam kontainer Anda tergantung pada throughput yang disediakan dan penyimpanan yang digunakan.

Anda harus mencoba menghindari kueri lintas partisi jika beban kerja Anda memenuhi kriteria berikut:

  • Anda berencana untuk memiliki lebih dari 30.000 RU yang disediakan
  • Anda berencana untuk menyimpan lebih dari 100 GB data

Langkah berikutnya

Lihat artikel berikut untuk mempelajari tentang partisi di Azure Cosmos DB: