

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

# Perencana kueri v3
<a name="query-planner-v3"></a>

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 hingga 2x secara keseluruhan dibandingkan Planner v2 di Amazon DocumentDB 5.0. Semua fitur dan operator baru di Amazon DocumentDB 8.0 kompatibel dengan Planner v3. Tahapan agregasi baru di Amazon DocumentDB 8.0 yang didukung oleh Planner v3 termasuk \$1replaceWith, \$1vectorSearch, \$1merge, \$1set, \$1unset, \$1bucket. Planner v3 juga mendukung fitur dan operator baru di Amazon DocumentDB 8.0 termasuk Collation, Views, \$1merge, \$1pow, \$1rand, \$1dateTrunc, \$1, \$1. dateToParts dateFromParts 

**Topics**
+ [Prasyarat](#nqp-prerequisites)
+ [Memilih perencana versi 3.0 sebagai perencana kueri default](#second-concept-chapter)
+ [Praktik terbaik](#nqp-best-practices)
+ [Batasan](#nqp-limitations)
+ [Perbaikan `aggregate` dan `distinct` Operator](#operator-improvements)
+ [Potensi perbedaan perilaku antara perencana versi 1.0, 3.0, dan MongoDB](#planner-behavior-differences)

## Prasyarat
<a name="nqp-prerequisites"></a>

Prasyarat berikut berlaku untuk perencana versi 3.0:
+ Planner versi 3.0 tersedia di semua wilayah di mana engine versi 8.0 tersedia. 
+ Perencana versi 3.0 adalah perencana kueri default ketika engine versi 8.0 dipilih.

## Memilih perencana versi 3.0 sebagai perencana kueri default
<a name="second-concept-chapter"></a>

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](cluster_parameter_groups-parameters.md) 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 **Terapkan saat reboot** akan membuat pilihan tidak efektif hingga reboot cluster berikutnya).

## Praktik terbaik
<a name="nqp-best-practices"></a>

Untuk hasil yang diharapkan, gunakan praktik terbaik berikut saat menerapkan perencana versi 3.0:
+ Di 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 yang dikurangi akan menjadi yang paling tidak mengganggu, karena mungkin ada peningkatan tingkat kesalahan jika versi perencana diubah saat beban kerja aktif berjalan.

## Batasan
<a name="nqp-limitations"></a>

Batasan berikut berlaku untuk perencana versi 3.0:
+ Planner versi 3.0 tidak didukung dalam cluster elastis, yang akan kembali ke versi perencana 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 `aggregate` dan `distinct` Operator
<a name="operator-improvements"></a>

Planner versi 3.0 memperkenalkan peningkatan di seluruh tahapan \$1agregat, dan perintah \$1distinct. Berikut ini adalah beberapa perbaikan yang paling penting.. 
+ Perencana memindahkan tahap \$1match lebih awal di pipeline bila memungkinkan, mengurangi jumlah dokumen yang diproses oleh tahap 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 tahap \$1lookup dan \$1unwind 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 yang 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"
                          }
                  }
          }
  }
  ```

## Potensi perbedaan perilaku antara perencana versi 1.0, 3.0, dan MongoDB
<a name="planner-behavior-differences"></a>

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

------
#### [ Feature Differences ]
+ Pada koleksi kosong atau ketika tahap sebelumnya seperti match menyaring semua dokumen, Planner v1 memberikan output “field” :0. Planner v3 dan MongoDB tidak akan memberikan output apa pun.
+ Dengan Plannerv1, \$1"\$1skip” :n\$1 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 \$1lookup tidak ada, plannerv1 memunculkan kesalahan. Planner v3 dan MongoDB memperlakukan koleksi asing sebagai koleksi kosong dan melakukan \$1lookup. 

  ```
  db.coll.aggregate([
      {$lookup: {from: "does_not_exist", localField: "a", foreignField: "a", as: "c"}}
  ])
  ```
+  Hanya Planner v1 yang akan mengizinkan penggunaan beberapa \$1search 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 melempar kesalahan dan Planner v1 tidak mendukung tahap \$1VectorSearch. 

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

------