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).