Menganalisis eksekusi kueri dengan Query Explain
Halaman ini menjelaskan cara mengambil informasi eksekusi kueri saat Anda menjalankan kueri.
Menggunakan Query Explain
Anda dapat menggunakan Query Explain untuk memahami cara kueri Anda dijalankan. Hal ini memberikan detail yang dapat Anda gunakan untuk mengoptimalkan kueri.
Anda dapat menggunakan Query Explain melalui konsol Google Cloud atau perintah explain.
Konsol
Jalankan kueri di Editor Kueri dan buka tab Explanation:
-
Di konsol Google Cloud , buka halaman Databases.
- Dari daftar database, pilih database Firestore dengan kompatibilitas MongoDB. Konsol Google Cloud membuka Firestore Explorer untuk database tersebut.
- Masukkan kueri di editor kueri, lalu klik Run.
-
Klik tab Penjelasan untuk melihat output analisis kueri.
MongoDB API
Query Explain di MongoDB API didukung melalui
perintah explain
yang dapat Anda gunakan pada alat seperti Mongo Shell dan Compass.
Perintah explain didukung dengan perintah aggregate,
find, distinct, dan count, misalnya:
db.collection.explain('executionStats').find(...)
Anda juga dapat menggunakan metode explain(), misalnya:
db.collection.find({QUERY}).explain('executionStats')Batasan
Perhatikan batasan dan perbedaan berikut:-
Query Explain tidak mendukung perintah yang menampilkan kursor. Misalnya, memanggil explain dengan memanggil perintah berikut secara langsung tidak didukung:
db.collection.aggregate(..., explain: true)
Query Explain hanya didukung pada perintah
find,aggregate,count,distinct,update,delete, danfindAndModify.-
Query Explain mendukung mode kejelasan
executionStats,allPlansExecution, danqueryPlanner.queryPlanner: Hanya menampilkan rencana eksekusi, tanpa menjalankan kueri,executionStatsdanallPlansExecution: Menampilkan rencana eksekusi beserta statistik penagihan, memori, dan eksekusi.
Jika tidak ada mode kejelasan yang ditentukan, shell akan ditetapkan secara default ke
queryPlanner. Untuk melihat statistik eksekusi lengkap, Anda harus menentukan mode kejelasanexecutionStatsatauallPlansExecution.
Analisis
Output Query Explain berisi dua komponen utama, yaitu Statistik Ringkasan dan Hierarki Eksekusi. Pertimbangkan kueri ini sebagai contoh:
db.orders.aggregate(
[
{ "$match": { "user_id": 1234 } },
{ "$sort": { "date_placed": 1 } }
]
)
Statistik Ringkasan
Bagian atas output yang dijelaskan berisi ringkasan statistik eksekusi. Gunakan statistik ini untuk menentukan apakah kueri memiliki latensi atau biaya yang tinggi. Selain itu, tab ini juga berisi statistik memori yang memberi tahu seberapa dekat kueri Anda dengan batas memori.
Execution:
results returned: 35
query id: 7e7b37ea1a259d79
request peak memory usage: 45.56 KiB (46,656 B)
data bytes read: 24.58 KiB (25,175 B)
entity row scanned: 265
Billing:
read units: 7
Hierarki Eksekusi
Hierarki eksekusi menjelaskan eksekusi kueri sebagai serangkaian node. Node bawah (node daun) mengambil data dari lapisan penyimpanan yang melintasi hierarki untuk menghasilkan respons kueri.
Untuk mengetahui detail tentang setiap node eksekusi, lihat Referensi eksekusi.
Untuk mengetahui detail cara menggunakan informasi ini guna mengoptimalkan kueri Anda, lihat Mengoptimalkan eksekusi kueri.
Berikut contoh hierarki eksekusi:
Execution:
results returned: 35
query id: 7e7b37ea1a259d79
request peak memory usage: 45.56 KiB (46,656 B)
data bytes read: 24.58 KiB (25,175 B)
entity row scanned: 265
Billing:
read units: 7
Tree:
• Compute
| $out_1: map_set($record_1, "__id__", $__id___1, "__key__", unset)
| is query result: true
|
| Execution:
| records returned: 35
| latency: 204.87 ms (local 7.64 ms)
|
└── • Compute
| $__id___1: _id($__key___2)
|
| Execution:
| records returned: 35
| latency: 197.23 ms (local 2.04 ms)
|
└── • MajorSort
| fields: [$v_5 ASC]
| output: [$__key___2, $record_1]
|
| Execution:
| records returned: 35
| latency: 195.20 ms (local 28.42 ms)
| peak memory usage: 45.56 KiB (46,656 B)
|
└── • Compute
| $v_5: offset($v_4, 0L)
|
| Execution:
| records returned: 35
| latency: 166.78 ms (local 14.84 ms)
|
└── • Compute
| $v_4: sortPaths(array($date_placed_1), [date_placed ASC])
|
| Execution:
| records returned: 35
| latency: 151.94 ms (local 5.43 ms)
|
└── • TableScan
source: **/orders
order: STABLE
filter: $eq($user_id_1, 1,234)
output bindings: {$__key___2=row().__key__, $date_placed_1=row().date_placed, $record_1=row[* - { __create_time__, __update_time__ }](), $user_id_1=row().user_id}
output: [$__key___2, $date_placed_1, $record_1]
Execution:
records returned: 35
latency: 146.50 ms
data bytes returned: 3.25 KiB (3,325 B)
post-filtered rows: 230
records scanned: 265
data bytes read: 24.58 KiB (25,175 B)
Langkah berikutnya
- Untuk mempelajari node hierarki eksekusi, lihat Referensi eksekusi kueri.
- Untuk mempelajari cara mengoptimalkan kueri, lihat Mengoptimalkan eksekusi kueri.