View a markdown version of this page

Analisis Rencana Kueri - Amazon DocumentDB

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

Analisis Rencana Kueri

Analisis rencana kueri melalui rencana penjelasan memberikan wawasan penting tentang kinerja kueri Amazon DocumentDB. Paket kueri dengan ExecutionStats mengungkapkan metrik utama termasuk:

  • Dokumen dikembalikan per tahap (nReturns)

  • Waktu eksekusi khusus tahapan (Perkiraan) executionTimeMillis

  • Durasi pembuatan rencana (planningTimeMillis)

Dengan memeriksa output rencana kueri, pengembang dapat menganalisis pola eksekusi, mengevaluasi pemanfaatan indeks, dan mengidentifikasi peluang optimasi potensial di seluruh tahapan pipa kueri.

Untuk menganalisis rencana kueri, Anda dapat menggunakan perintah explain () dalam format berikut.

db.runCommand({explain: {query document}, verbosity: "executionStats"}) db.collection.find().explain("executionStats");

Berikut ini adalah contoh operasi:

db.collection.find({ companyname: { '$eq': 'ANYCOMPANY' }, isDeleted: { '$eq': false } }).sort({"createdAt":1}).limit(2).explain("executionStats");

Keluaran dari operasi ini terlihat seperti berikut ini:

{ queryPlanner: { plannerVersion: 2, namespace: 'limit_test.test', winningPlan: { stage: 'LIMIT_SKIP', inputStage: { stage: 'SORT', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, indexFilterSet: false, indexFilterApplied: false, executionStats: { executionSuccess: true, executionTimeMillis: '4.186', planningTimeMillis: '3.909', executionStages: { stage: 'LIMIT_SKIP', nReturned: '2', executionTimeMillisEstimate: '0.199', inputStage: { stage: 'SORT', nReturned: '2', executionTimeMillisEstimate: '0.197', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', nReturned: '34', executionTimeMillisEstimate: '0.151', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, serverInfo: { host: 'demo-cluster', port: 27017, version: '5.0.0' }, ok: 1, operationTime: Timestamp({ t: 1759915116, i: 1 }) }

Di bawah ini adalah analisis terperinci dari rencana eksekusi kueri Amazon DocumentDB, yang memecah setiap komponen dan karakteristik kinerjanya.

Waktu Keseluruhan

executionTimeMillis mewakili total waktu yang diambil oleh kueri termasuk waktu perencanaan.

planningTimeMillis mewakili total waktu perencanaan yang diambil oleh kueri.

Tahapan Eksekusi

Ini menjelaskan step-by-step proses yang digunakan Amazon DocumentDB untuk mengeksekusi kueri, menunjukkan bagaimana data mengalir melalui operasi yang berbeda.

"executionStages": { "stage": "[STAGE_NAME]", "nReturned": "[NUMBER_OF_DOCS]", "executionTimeMillisEstimate": "[TIME]", "inputStage": { // Nested stages } }

Tahapan Umum dalam Rencana Kueri

Di bawah ini adalah tahapan eksekusi umum dalam rencana kueri. Setiap tahap mengembalikan metrik executionTimeMillis Estimasi (waktu eksekusi) dan nReturn (jumlah dokumen) untuk membantu mengevaluasi kinerja kueri di setiap tahap.

COLLSCAN (Pemindaian Koleksi)

  • Memindai seluruh dokumen koleksi berdasarkan dokumen

  • nReturned: Mengembalikan semua dokumen yang cocok dalam koleksi

  • Bisa menjadi operasi yang mahal, terlihat ketika tidak ada indeks yang tersedia

IXSCAN (Pemindaian Indeks)

  • Menggunakan indeks untuk menemukan dokumen yang cocok

  • NReturns: Hanya dokumen yang cocok berdasarkan indeks

  • Operasi yang efisien, lebih disukai daripada COLLSCAN

SORT

  • Mengurutkan dokumen berdasarkan bidang tertentu

  • Jika atribut sort dalam query bukan bagian dari indeks, tahap ini akan muncul secara eksplisit

  • nReturns: Nomor yang sama dengan dokumen masukan

  • Memori intensif untuk set hasil besar. Untuk mengoptimalkan, tambahkan nama bidang sortir ke indeks

LIMIT_LEWATI

  • Mengontrol jumlah dokumen yang dikembalikan dan dilewati

  • nReturns: Dibatasi oleh nilai LIMIT

  • Digunakan untuk pagination atau operasi LIMIT

SUBSCAN

  • Melakukan operasi kueri bersarang

  • nReturned: Bervariasi berdasarkan hasil subquery

  • Digunakan dalam kueri kompleks dengan beberapa tahap

Tahapan dengan executionTimeMillis Estimasi tinggi adalah kandidat yang baik untuk optimasi.

catatan

Parameter ExecutionStats saat ini tidak mendukung perintah update dan delete.

Memahami DocsExamined dalam Menjelaskan Statistik Eksekusi Rencana

Saat Anda menjalankan kueriexplain("executionStats"), Amazon DocumentDB menyediakan metrik pemeriksaan yang membantu Anda memahami berapa banyak dokumen yang dipindai untuk menghasilkan hasil kueri. Metrik ini berguna untuk mengidentifikasi rencana kueri yang tidak efisien dan mengoptimalkan kinerja.

catatan

Hanya tersedia di Amazon DocumentDB 8.0.0+.

Bidang

Bidang Deskripsi Tingkat
totalDocsExamined Jumlah total dokumen yang diperiksa di semua tahap eksekusi. ExecutionStats tingkat atas
DocsExamined Jumlah dokumen diperiksa oleh tahap eksekusi tertentu. Tingkat panggung

docsExaminedBidang muncul pada tahapan berikut:

Stage Deskripsi
COLLSCAN Pemindaian koleksi. Semua dokumen dalam koleksi diperiksa.
IXSCAN Pemindaian indeks. Hanya dokumen yang cocok dengan kondisi indeks yang diperiksa.
AMBIL Ketika pengoptimal mengambil dokumen dalam tahap terpisah dari IXSCAN, tahap FETCH melaporkan DocsExamined. Dalam rencana pemindaian indeks, tahapan IXSCAN anak tidak melaporkan DocsExamined. Dalam rencana $lookup, tahap FETCH dan tahapan turunannya dapat melaporkan DocsExamined.
catatan

docsExaminedtidak muncul pada tahap IXONLYSCAN karena kueri dipenuhi sepenuhnya dari indeks tanpa mengakses dokumen.

Tampilkan DocsExamined di Expline Plan ExecutionStats Output

Contoh berikut menggunakan koleksi dengan 500.000 dokumen dan menunjukkan bagaimana docsExamined perubahan di berbagai tahap eksekusi kueri.

Buat data sampel:

for (let i = 0; i < 500000; i++) { db.coll.insertOne({ number: i, arr: [i, [i+1]], value: "test", bool: i % 2 === 0 }); }

Pemindaian Koleksi (COLLSCAN)

Tanpa indeks, Amazon DocumentDB melakukan pemindaian koleksi lengkap.

db.coll.find({ "number": { "$lt": 500 } }).explain("executionStats").executionStats

Output:

{ "executionSuccess" : true, "nReturned" : "500", "executionTimeMillis" : "282.055", "planningTimeMillis" : "0.085", "totalDocsExamined" : "500000", "executionStages" : { "stage" : "COLLSCAN", "nReturned" : "500", "executionTimeMillisEstimate" : "281.915", "docsExamined" : "500000", "filter" : { "number" : { "$lt" : 500 } } } }

Semua 500.000 dokumen diperiksa untuk mengembalikan 500 hasil. Membuat indeks pada bidang angka meningkatkan ini.

Pemindaian Indeks (IXSCAN)

db.coll.createIndex({ number: 1 }); db.coll.find({ "number": { "$lt": 5000 } }).explain("executionStats").executionStats

Output:

{ "executionSuccess" : true, "nReturned" : "5000", "executionTimeMillis" : "3.047", "planningTimeMillis" : "0.296", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "5000", "executionTimeMillisEstimate" : "2.576", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] } } }

Dengan indeks tersebut, hanya 5.000 dari 500.000 dokumen yang diperiksa dan diambil, sesuai dengan jumlah yang dikembalikan. Kondisi indeks menyaring 495.000 dokumen yang tidak cocok dengan kueri.

Pemindaian Indeks dengan Filter Sisa

db.coll.find({ "number": { "$lt": 5000 }, "arr": { "$gt": 4000 } }).explain("executionStats").executionStats

Output:

{ "executionSuccess" : true, "nReturned" : "999", "executionTimeMillis" : "15.367", "planningTimeMillis" : "0.115", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "999", "executionTimeMillisEstimate" : "15.170", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] }, "filter" : { "arr" : { "$gt" : 4000 } } } }

Kondisi indeks cocok dengan 5.000 dokumen dari 500.000, kemudian filter residu pada arr mengurangi hasilnya menjadi 999. docsExaminedNilai 5.000 mencerminkan semua dokumen yang diperiksa setelah kondisi indeks tetapi sebelum filter sisa diterapkan.

Ambil dengan IXSCAN

db.coll.find({ "$or": [{ "number": { "$lt": 100000 } }, { "number": { "$gt": 400000 } }] }).explain("executionStats").executionStats

Output:

{ "executionSuccess" : true, "nReturned" : "199999", "executionTimeMillis" : "899.801", "planningTimeMillis" : "0.183", "totalDocsExamined" : "199999", "executionStages" : { "stage" : "FETCH", "nReturned" : "199999", "executionTimeMillisEstimate" : "894.141", "docsExamined" : "199999", "inputStage" : { "stage" : "IXOR", "nReturned" : "0", "executionTimeMillisEstimate" : "874.897", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "100000", "executionTimeMillisEstimate" : "462.208", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$lt" : 100000 } } ] } }, { "stage" : "IXSCAN", "nReturned" : "99999", "executionTimeMillisEstimate" : "412.684", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$gt" : 400000 } } ] } } ] } } }

Saat pengoptimal Amazon DocumentDB menggunakan tahap pengambilan untuk mengambil dokumen, tahap FETCH akan melaporkan. docsExamined Tahapan IXSCAN anak tidak melaporkan docsExamined karena mereka hanya memindai kunci indeks tanpa mengakses dokumen secara langsung.

AMBIL dengan Pencarian Agregat

db.coll.explain("executionStats").aggregate([ { $match: { "number": { "$lt": 5 } } }, { $lookup: { from: "coll", pipeline: [{ $match: { "number": { "$lt": 3 } } }], as: "sub" } } ]).executionStats

Output:

{ "executionSuccess" : true, "nReturned" : "5", "executionTimeMillis" : "0.525", "planningTimeMillis" : "0.327", "totalDocsExamined" : "9", "executionStages" : { "stage" : "NESTED_LOOP_LOOKUP", "nReturned" : "5", "executionTimeMillisEstimate" : "0.163", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "5", "executionTimeMillisEstimate" : "0.039", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5 } } ] } }, { "stage" : "FETCH", "nReturned" : "1", "executionTimeMillisEstimate" : "0.009", "docsExamined" : "1", "inputStage" : { "stage" : "AGGREGATE", "nReturned" : "1", "executionTimeMillisEstimate" : "0.044", "inputStage" : { "stage" : "IXSCAN", "nReturned" : "3", "executionTimeMillisEstimate" : "0.013", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "3", "indexCond" : { "$and" : [ { "number" : { "$lt" : 3 } } ] } } } } ] } }

IXSCAN luar memeriksa 5 dokumen yang cocok dengan nomor < 5. IXSCAN bagian dalam memeriksa 3 dokumen yang cocok dengan nomor < 3, dan tahap FETCH memeriksa 1 hasil agregat. totalDocsExaminedDari 9 adalah jumlah di semua tahap (5 + 3 + 1).