View a markdown version of this page

Perencana kueri v3 - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Perencana kueri v3

Planner Versi 3 di Amazon DocumentDB 8.0 mendukung 21 tahap agregasi, termasuk 6 tahap baru. Planner V3 hadir dengan dukungan bawaan untuk perintah yang berbeda. Ini menawarkan peningkatan kinerja keseluruhan hingga 2x dibandingkan Planner v2 di Amazon DocumentDB 5.0. Semua fitur dan operator baru di Amazon DocumentDB 8.0 kompatibel dengan Planner v3. Tahap agregasi baru di Amazon DocumentDB 8.0 yang didukung oleh Planner v3 termasuk $replaceWith, $vectorSearch, $merge, $set, $unset, $bucket. Planner v3 juga mendukung fitur dan operator baru di Amazon DocumentDB 8.0 termasuk Collation, Views, $merge, $pow, $rand, $dateTrunc, $date, $date. ToParts FromParts

Prasyarat

Prasyarat berikut berlaku untuk perencana versi 3.0:

  • Planner versi 3.0 tersedia di semua Wilayah AWS tempat mesin versi 8.0 tersedia.

  • Planner versi 3.0 adalah perencana kueri default ketika mesin versi 8.0 dipilih.

Memilih Planner versi 3.0 sebagai perencana kueri default

Jika Anda mengubah perencana kueri default di Amazon DocumentDB 8.0, dan perlu kembali ke planner v3, Anda dapat melakukannya dari konsol atau CLI:

  • Ikuti langkah-langkah Memodifikasi parameter cluster Amazon DocumentDB untuk memodifikasi grup parameter cluster Anda.

  • Untuk parameter berjudul 'PlannerVersion', ubah nilainya menjadi 3.0 yang menunjukkan perencana versi 3.0.

  • Pilih Terapkan segera (memilih Ter apkan saat reboot akan membuat pilihan tidak efektif sampai reboot cluster berikutnya).

Praktik terbaik

Untuk hasil yang diharapkan, gunakan praktik terbaik berikut saat menerapkan perencana versi 3.0:

  • Dalam cluster global, pilih plannerVersion nilai yang sama (1.0 atau 2.0 atau 3.0) di grup parameter cluster untuk kedua Wilayah. Perhatikan bahwa memilih versi perencana yang berbeda di Wilayah primer dan sekunder dapat menyebabkan perilaku dan kinerja kueri yang tidak konsisten.

  • Memperbarui ke perencana versi 3.0 selama jendela pemeliharaan terjadwal atau selama periode lalu lintas berkurang akan menjadi yang paling tidak mengganggu, karena mungkin ada peningkatan tingkat kesalahan jika versi perencana diubah saat beban kerja aktif berjalan.

Batasan

Batasan berikut berlaku untuk Planner versi 3.0:

  • Planner versi 3.0 tidak didukung di cluster elastis, yang akan kembali ke Planner versi 1.0.

  • Sementara Planner v1 memungkinkan penggunaan 'PlanHint' untuk memastikan bahwa rencana kueri tertentu dipilih oleh pengoptimal kueri, Planner v3 tidak mengizinkan penggunaan 'PlanHint' dan bergantung pada pengoptimalan internal untuk memilih paket terbaik untuk kueri yang diberikan.

Perbaikan untuk Oper ator agregat dan berbeda

Planner versi 3.0 memperkenalkan peningkatan di seluruh tahapan $agregate, dan perintah $distinct. Berikut ini adalah beberapa peningkatan yang paling penting..

  • Perencana memindahkan tahap $match lebih awal dalam pipeline jika memungkinkan, mengurangi jumlah dokumen yang diproses oleh tahapan berikutnya.

    //Planner v1 db.orders.aggregate([ { $project: { customerId: 1, orderDate: 1, totalAmount: 1 } }, { $match: { customerId: { $gt: 1000 } } } ]) // Planner v3 pulls up the match since customerId exists in original documents // Optimized internally as: db.orders.aggregate([ { $match: { customerId: { $gt: 1000 } } }, // Pulled up before project { $project: { customerId: 1, orderDate: 1, totalAmount: 1 } } ])
  • Perencana secara otomatis menggabungkan tahapan $lookup dan $unwind ketika mereka beroperasi di bidang yang sama, mengurangi pemrosesan data perantara dan meningkatkan kinerja.

    Example query: //Planner v1 db.orders.aggregate([ { $lookup: { from: "products", localField: "productId", foreignField: "_id", as: "productInfo" } }, { $unwind: "$productInfo" }, { $project: { orderDate: 1, "productInfo.name": 1, "productInfo.price": 1 } } ]) // Planner version 3.0 optimizes this internally by coalescing the $lookup and $unwind stages
  • Planner versi 3.0 memperkenalkan strategi eksekusi Distinct Scan baru yang secara signifikan meningkatkan kinerja untuk operasi berbeda pada indeks kardinalitas rendah.

    Example query: //// If there is a low cardinality index on "category", you may see a query plan like below db.explain().products.distinct("category") "queryPlanner" : { "plannerVersion" : 3, "namespace" : "db.products", "winningPlan" : { "stage" : "AGGREGATE", "inputStage" : { "stage" : "DISTINCT_SCAN", "inputStage" : { "stage" : "IXONLYSCAN", "indexName" : "category_1", "direction" : "forward" } } } }

Rencanakan filter cache

Planner versi 3.0 mendukung filter cache rencana, juga disebut filter indeks, yang memungkinkan Anda membatasi kumpulan indeks yang dipertimbangkan perencana untuk bentuk kueri tertentu. Filter diatur dengan perintah database dan diterapkan pada server, jadi jika Anda mengalami regresi kueri, Anda dapat menguranginya tanpa memodifikasi kode aplikasi Anda.

Planner versi 3.0 menerapkan filter cache rencana ke lebih banyak perintah daripada perencana versi 2.0:

  • Per distinct intah ini membutuhkan Planner versi 3.0.

  • Per aggregate intah ini membutuhkan perencana versi 3.0 dan Amazon DocumentDB 8.0.2. Filter berlaku ketika pipa membaca koleksi melalui $match tahap terdepan.

  • Filter yang ditetapkan pada koleksi asing dari pang $graphLookup gung $lookup atau mendorong indeks yang digunakan untuk memindai koleksi asing itu. Ini juga membutuhkan perencana versi 3.0 dan Amazon DocumentDB 8.0.2.

Untuk informasi selengkapnya tentang referensi perintah, bentuk kueri yang didukung, contoh kerja, dan bagaimana filter berinteraksi dengan petunjuk, lihatRencanakan filter cache.

Perbedaan perilaku potensial antara perencana versi 1.0, 3.0, dan MongoDB

Dalam beberapa kasus edge, ada kemungkinan bahwa Planner versi 3.0 dapat menghasilkan hasil yang sedikit berbeda dari Planner versi 1.0. Bagian ini membahas beberapa contoh kemungkinan ini.

Feature Differences
  • Pada koleksi kosong atau ketika tahap sebelumnya seperti kecocokan memfilter semua dokumen, Planner v1 memberikan output “bidang” :0. Planner v3 dan MongoDB tidak akan memberikan output apa pun.

  • Dengan Plannerv1, {"$skip” :n} tidak melewatkan jika ada kurang dari n dokumen yang dikembalikan oleh tahap sebelumnya. Plannerv3 dan MongoDB melewatkan dengan benar terlepas dari jumlah dokumen yang dikembalikan.

  • Ketika koleksi asing yang direferensikan di $lookup tidak ada, plannerv1 memunculkan kesalahan. Planner v3 dan MongoDB memperlakukan koleksi asing sebagai koleksi kosong dan melakukan $lookup.

    db.coll.aggregate([ {$lookup: {from: "does_not_exist", localField: "a", foreignField: "a", as: "c"}} ])
  • Hanya Planner v1 yang mengizinkan penggunaan beberapa $search dalam pipeline Planner v2/v3 akan menimbulkan kesalahan dan MongoDB tidak mendukungnya.

    VectorSearch = { "$search": { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "cosine", "k": 2, "efSearch": 1 }}} db.coll.aggregate([VectorSearch, VectorSearch])
  • Hanya Planner v3 yang berfungsi ketika tahap VectorSearch bukan tahap pertama. Dalam hal ini, MongoDB akan menimbulkan kesalahan dan Planner v1 tidak mendukung tahap $VectorSearch.

    VectorSearch = { {"$vectorSearch": { "queryVector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "limit": 4, "numCandidates": 100} } db.coll.aggregate([$match:{}, VectorSearch])