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)
-
Stage-specific waktu eksekusi (eksekusiTimeMillisEstimate)
-
Durasi pembuatan rencana (perencanaanTimeMillis)
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
eksekusi TimeMillis mewakili total waktu yang diambil oleh query termasuk waktu perencanaan.
perencanaan TimeMillis mewakili total waktu perencanaan yang diambil oleh kueri.
Tahapan Eksekusi
Ini menjelaskan proses langkah demi langkah 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 eksekusi TimeMillisEstimate (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
-
Memory-intensive 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 eksekusi tinggi TimeMillisEstimate 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 |
|---|---|---|
| total DocsExamined | Jumlah total dokumen yang diperiksa di semua tahap eksekusi. | Top-level ExecutionStats |
| DocsExamined | Jumlah dokumen diperiksa oleh tahap eksekusi tertentu. | Stage-level |
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 sisa 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.
FETCH 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).