Output penjelasan MySQL cukup mudah. PostgreSQL sedikit lebih rumit. Saya juga belum bisa menemukan sumber yang bagus untuk menjelaskannya.
Dapatkah Anda menjelaskan apa yang sebenarnya dikatakan menjelaskan atau setidaknya mengarahkan saya ke sumber yang baik?
postgresql
kjg
sumber
sumber
Bagian yang selalu membingungkan saya adalah biaya awal vs biaya total. Saya Google ini setiap kali saya melupakannya, yang membawa saya kembali ke sini, yang tidak menjelaskan perbedaannya, itulah mengapa saya menulis jawaban ini. Inilah yang saya kumpulkan dari dokumentasi Postgres
EXPLAIN
, dijelaskan seperti yang saya pahami.Berikut contoh dari aplikasi yang mengelola forum:
Berikut penjelasan grafis dari PgAdmin:
(Saat Anda menggunakan PgAdmin, Anda dapat mengarahkan mouse ke komponen untuk membaca detail biaya.)
Biaya direpresentasikan sebagai tupel, misalnya biaya dari
LIMIT
adalahcost=0.00..3.39
dan biaya berurutan scanningpost
adalahcost=0.00..15629.12
. Angka pertama pada tupel adalah biaya awal dan angka kedua adalah biaya total . Karena saya menggunakanEXPLAIN
dan tidakEXPLAIN ANALYZE
, biaya ini hanyalah perkiraan, bukan ukuran sebenarnya.Sebagai komplikasi, biaya setiap node "induk" mencakup biaya node turunannya. Dalam representasi teks, pohon diwakili oleh lekukan, misalnya
LIMIT
simpul induk danSeq Scan
anaknya. Dalam representasi PgAdmin, panah menunjuk dari anak ke orang tua - arah aliran data - yang mungkin berlawanan dengan intuisi jika Anda terbiasa dengan teori grafik.Dokumentasi mengatakan bahwa biaya sudah termasuk semua node turunan, tetapi perhatikan bahwa total biaya induk
3.39
jauh lebih kecil daripada total biaya turunannya15629.12
. Total biaya tidak termasuk karena komponen sepertiLIMIT
tidak perlu memproses seluruh inputnya. LihatEXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2;
contohnya di dokumentasi PostgresEXPLAIN
.Dalam contoh di atas, waktu startup adalah nol untuk kedua komponen, karena tidak ada komponen yang perlu melakukan pemrosesan apa pun sebelum mulai menulis baris: pemindaian berurutan membaca baris pertama tabel dan memancarkannya. The
LIMIT
membaca baris pertama dan kemudian memancarkan itu.Kapan sebuah komponen perlu melakukan banyak pemrosesan sebelum dapat mulai mengeluarkan baris apa pun? Ada banyak kemungkinan alasannya, tetapi mari kita lihat satu contoh yang jelas. Berikut kueri yang sama dari sebelumnya tetapi sekarang berisi
ORDER BY
klausa:Dan secara grafis:
Sekali lagi, pemindaian sekuensial pada
post
tidak memiliki biaya permulaan: ia segera mulai mengeluarkan baris. Tetapi pengurutan memiliki biaya awal yang signifikan23283.24
karena harus mengurutkan seluruh tabel sebelum dapat menghasilkan bahkan satu baris . Total biaya pengurutan23859.27
hanya sedikit lebih tinggi daripada biaya permulaan, yang mencerminkan fakta bahwa setelah seluruh kumpulan data telah diurutkan, data yang diurutkan dapat dikeluarkan dengan sangat cepat.Perhatikan bahwa waktu startup
LIMIT
23283.24
persis sama dengan waktu startup semacam itu. Ini bukan karenaLIMIT
waktu startup sendiri tinggi. Ini sebenarnya tidak memiliki waktu startup dengan sendirinya, tetapiEXPLAIN
mengumpulkan semua biaya turunan untuk setiap orang tua, sehinggaLIMIT
waktu startup mencakup jumlah waktu startup dari turunannya.Rollup biaya ini dapat mempersulit pemahaman biaya eksekusi setiap komponen. Misalnya,
LIMIT
waktu startup kami nol, tapi itu tidak jelas pada pandangan pertama. Untuk alasan ini, beberapa orang lain menautkan ke menjelaskan.depesz.com , alat yang dibuat oleh Hubert Lubaczewski (alias depesz) yang membantu memahamiEXPLAIN
dengan - antara lain - mengurangi biaya anak dari biaya orang tua. Dia menyebutkan beberapa kerumitan lain dalam postingan blog singkat tentang alatnya.sumber
Ini dijalankan dari yang paling menjorok ke yang paling tidak menjorok, dan saya percaya dari bawah rencana ke atas. (Jadi, jika ada dua bagian yang menjorok ke bawah, bagian yang berada jauh di bawah halaman dijalankan terlebih dahulu, lalu ketika bertemu yang lain dijalankan, maka aturan yang menggabungkannya dijalankan.)
Idenya adalah bahwa di setiap langkah ada 1 atau 2 dataset yang datang dan diproses oleh beberapa aturan. Jika hanya satu kumpulan data, operasi itu dilakukan untuk kumpulan data itu. (Misalnya memindai indeks untuk mencari tahu baris apa yang Anda inginkan, memfilter kumpulan data, atau mengurutkannya.) Jika dua, kedua kumpulan data adalah dua hal yang diindentasi lebih jauh, dan mereka digabungkan dengan aturan yang Anda lihat. Arti dari sebagian besar aturan dapat dengan mudah ditebak (terutama jika Anda telah membaca banyak rencana penjelasan sebelumnya), namun Anda dapat mencoba untuk memverifikasi item individual baik dengan melihat di dokumentasi atau (lebih mudah) dengan hanya memasukkan frasa ke dalam Google bersama dengan beberapa kata kunci seperti
EXPLAIN
.Ini jelas bukan penjelasan lengkap, tetapi memberikan konteks yang cukup sehingga Anda biasanya dapat mengetahui apa pun yang Anda inginkan. Misalnya pertimbangkan rencana ini dari database yang sebenarnya:
Cobalah membacanya sendiri dan lihat apakah itu masuk akal.
Apa yang saya baca adalah bahwa database pertama-tama memindai
id_orderitem_productid
indeks, menggunakannya untuk menemukan baris yang diinginkannyaorderitem
, kemudian mengurutkan dataset tersebut menggunakan quicksort (jenis yang digunakan akan berubah jika data tidak sesuai dengan RAM), lalu sisihkan.Selanjutnya, ia memindai
orditematt_attributeid_idx
untuk menemukan baris yang diinginkannyaorderitemattribute
dan kemudian mengurutkan set data itu menggunakan quicksort.Kemudian mengambil dua kumpulan data dan menggabungkannya. (Penggabungan gabungan adalah semacam operasi "zipping" yang menjalankan dua kumpulan data yang diurutkan secara paralel, memancarkan baris yang digabungkan saat cocok.)
Seperti yang saya katakan, Anda mengerjakan bagian dalam rencana ke bagian luar, dari bawah ke atas.
sumber
Ada juga alat bantu online yang tersedia, Depesz , yang akan menyoroti di mana bagian mahal dari hasil analisis tersebut.
juga punya satu, berikut hasil yang sama , yang bagi saya membuatnya lebih jelas di mana masalahnya.
sumber
PgAdmin akan menunjukkan kepada Anda representasi grafis dari rencana penjelasan. Beralih bolak-balik di antara keduanya benar-benar dapat membantu Anda memahami apa arti representasi teks. Namun, jika Anda hanya ingin tahu apa yang akan dilakukan, Anda mungkin bisa selalu menggunakan GUI.
sumber
Dokumentasi resmi PostgreSQL memberikan penjelasan yang menarik dan menyeluruh tentang cara memahami output penjelasan.
sumber
Jika Anda menginstal pgadmin, ada tombol Jelaskan yang juga memberikan output teks menggambar diagram tentang apa yang terjadi, menunjukkan filter, menyortir, dan penggabungan sub-set yang menurut saya sangat berguna untuk melihat apa yang terjadi.
sumber