Persediaan Temu Duga Pengaturcaraan · Pelajaran

Membaca Pelan EXPLAIN

Mentafsir jenis imbasan, kaedah cantuman dan anggaran kos dalam pelan pertanyaan.

Pelajaran 1 daripada 413 langkah

Membaca Pelan EXPLAIN ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Mengapa Penemu Duga Bertanya tentang EXPLAIN

Sebaik sahaja Anda sampai ke sesi temu duga peringkat kanan, penemu duga berhenti bertanya tulis pertanyaan dan mula bertanya mengapa pertanyaan ini lambat. Alat yang menjawabnya ialah EXPLAIN.

EXPLAIN menunjukkan pelan pelaksanaan pangkalan data: strategi langkah demi langkah yang dipilih oleh perancang untuk menjalankan SQL Anda. Ia mendedahkan jadual yang diimbas, susunan jadual digabungkan dan anggaran kos bagi setiap langkah.

Keupayaan membaca pelan menunjukkan bahawa Anda memahami enjin, bukan sekadar sintaks. Itulah sempadan yang digunakan oleh penemu duga untuk membezakan peringkat pertengahan daripada peringkat kanan.

EXPLAIN berbanding EXPLAIN ANALYZE

Terdapat dua jenis, dan penemu duga gemar menguji perbezaannya.

  • EXPLAIN menunjukkan pelan anggaran perancang tanpa menjalankan pertanyaan. Pantas dan selamat.
  • EXPLAIN ANALYZE benar-benar menjalankan pertanyaan dan melaporkan kiraan baris serta masa pelaksanaan sebenar bersama anggaran.

Nilai paling berharga ialah membandingkan baris yang dianggarkan dengan baris sebenar. Percanggahan besar bermaksud perancang mempunyai statistik yang kurang baik dan berkemungkinan membuat pilihan yang tidak tepat.

Perhatian: EXPLAIN ANALYZE benar-benar menjalankan pertanyaan, jadi ia akan melaksanakan apa-apa INSERT atau UPDATE kecuali jika dibalut dalam transaksi yang dibatalkan semula.

EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 42;

Cara Membaca Pepohon

Pelan ialah sebuah pepohon, bukan senarai. Nod yang paling menjorok ke dalam ialah daun yang dijalankan dahulu; hasil mengalir ke atas menuju akar, yang menghasilkan hasil akhir.

Bacanya dari dalam ke luar: cari nod yang terdalam; di situlah pelaksanaan bermula. Setiap nod induk menggunakan baris yang dikeluarkan oleh nod anaknya.

Dalam temu duga, huraikannya begini: pertama, kita mengimbas jadual ini, baris tersebut disalurkan ke cantuman ini, cantuman itu disalurkan ke pengisihan, dan pengisihan itu disalurkan ke had. Huraian dari bawah ke atas itulah yang ingin mereka dengar.

Anatomi Nod Pelan

Setiap nod dalam pelan Postgres membawa nombor utama yang sama:

  • cost=0.00..35.50 kos permulaan..kos keseluruhan dalam unit perancang sewenang-wenangnya
  • rows=1000 anggaran bilangan baris yang dihasilkan
  • width=64 anggaran saiz purata baris dalam bait

Kos pertama ialah kos permulaan (kerja yang dilakukan sebelum baris pertama muncul, seperti membina jadual cincangan). Kos kedua ialah kos keseluruhan untuk mengembalikan semua baris. Kos keseluruhan yang lebih tinggi menunjukkan anggaran perancang terhadap perbelanjaan relatif.

Seq Scan on orders  (cost=0.00..35.50 rows=1000 width=64)

Contoh Lengkap

Pertimbangkan pertanyaan ringkas dengan penapis. Pelan di bawah menerangkan keseluruhannya dalam satu baris.

Pelan itu ialah Imbasan Berjujukan (bacaan seluruh jadual) pada orders, dengan menggunakan penapis status = 'shipped'. Perancang menganggarkan terdapat 1000 baris yang sepadan.

Jika orders mempunyai 10 juta baris dan hanya 1000 yang sepadan, penemuduga mengharapkan anda berkata: imbasan berjujukan di sini membazir, manakala indeks pada status (atau pada lajur yang lebih selektif) membolehkan kita mengelakkan pembacaan seluruh jadual.

EXPLAIN SELECT * FROM orders WHERE status = 'shipped';

Seq Scan on orders  (cost=0.00..18334.00 rows=1000 width=64)
  Filter: (status = 'shipped'::text)

Baris Anggaran berbanding Baris Sebenar

Dengan EXPLAIN ANALYZE, anda juga mendapat nombor sebenar dalam tanda kurung.

Lihat contoh ini: perancang menganggarkan 1000 baris tetapi sebenarnya mendapat 480000 baris. Ini ialah anggaran terkurang sebanyak 480 kali. Perancang memilih strateginya dengan mengandaikan terdapat sedikit baris, jadi pilihannya mungkin salah untuk data sebenar.

Dalam temu duga, jurang ini ialah diagnosis utama anda: statistik sudah lapuk, jalankan ANALYZE pada jadual itu, kemudian perancang berkemungkinan besar memilih pelan yang lebih baik.

Seq Scan on orders
  (cost=0.00..18334.00 rows=1000 width=64)
  (actual time=0.02..210.4 rows=480000 loops=1)

Maksud Gelung=N

Nilai loops lebih penting daripada jangkaan kebanyakan calon. Nilai itu ialah bilangan kali sesuatu nod dilaksanakan.

Nilai ini muncul pada bahagian dalaman cantuman gelung bersarang: nod dalaman dijalankan sekali bagi setiap baris luaran. Jika loops=480000, langkah dalaman itu dilaksanakan sebanyak 480 ribu kali.

Penting: masa bagi setiap baris dan bilangan baris yang dipaparkan ialah bagi setiap gelung. Untuk mendapatkan jumlah sebenar, darabkan nilai tersebut dengan loops. Nod yang kelihatan murah pada 0.004 milisaat bagi setiap gelung menjadi hampir 2 saat selepas 480000 gelung.

Index Scan using idx_cust on orders
  (actual time=0.003..0.004 rows=1 loops=480000)

Kos Bersifat Relatif, Bukan Milisaat

Perangkap yang kerap berlaku: calon membaca cost=18334 lalu berkata ini mengambil masa 18 saat. Salah.

Kos dinyatakan dalam unit perancang sewenang-wenangnya, yang ditentukur supaya satu bacaan halaman berjujukan bersamaan dengan 1.0. Kos hanya bermakna untuk membandingkan pelan antara satu sama lain, bukan sebagai angka masa sebenar.

Untuk mendapatkan masa sebenar, anda memerlukan EXPLAIN ANALYZE dan nilai actual timenya, yang diukur dalam milisaat. Nyatakan perkara ini dengan jelas dalam temu duga; ini menunjukkan bahawa anda benar-benar memahami metrik tersebut.

Membaca Pelan Cantuman

Inilah pelan yang melibatkan dua jadual. Bacanya dari bawah ke atas.

Dua imbasan pertama mengumpulkan baris daripada orders dan customers. Imbasan tersebut membekalkan baris kepada Cantuman Cincangan: satu sisi dicincang, manakala sisi yang lain mencari dalam cincangan itu. Hasil cantuman kemudiannya membekalkan hasil akhir.

Perhatikan bahawa lekukan menunjukkan strukturnya: kedua-dua imbasan berada di bawah Cantuman Cincangan. Penemuduga mahu anda mengenal pasti kaedah cantuman (cincangan dalam contoh ini) dan jadual yang dicincang (biasanya jadual yang lebih kecil).

Hash Join  (cost=30.0..520.0 rows=900 width=72)
  Hash Cond: (o.customer_id = c.id)
  ->  Seq Scan on orders o  (cost=0..400 rows=10000)
  ->  Hash  (cost=18..18 rows=500)
        ->  Seq Scan on customers c  (cost=0..18 rows=500)

Tanda Amaran yang Perlu Dikenal Pasti

Latih mata anda untuk mengenal pasti tanda amaran ini dalam mana-mana pelan:

  • Imbasan Berjujukan pada jadual yang sangat besar dengan penapis selektif; indeks mungkin membantu.
  • Baris anggaran jauh berbeza daripada baris sebenar; statistik sudah lapuk.
  • Cantuman Gelung Bersarang dengan bilangan gelung yang tinggi pada jadual besar; biasanya terdapat indeks yang tiada pada kunci cantuman dalaman.
  • Pengisihan atau pencincangan melimpah ke cakera (ditunjukkan sebagai penggunaan Disk); work_mem terlalu kecil.
  • Baris yang Dibuang oleh Penapis sangat banyak; anda membaca lalu membuang sebahagian besar jadual.

Format Hasil dan BUFFERS

Pelan tersedia dalam beberapa format. TEXT lalai ialah format yang anda baca dengan lantang dalam temu duga. Namun, anda juga boleh meminta hasil berstruktur.

EXPLAIN (FORMAT JSON) atau FORMAT YAML menghasilkan pelan yang boleh dibaca mesin, untuk dihuraikan oleh alat dan papan pemuka. Anda jarang perlu membacanya secara manual, tetapi mengetahui kewujudannya menunjukkan pengalaman anda.

Tambahkan pilihan dalam tanda kurung: EXPLAIN (ANALYZE, BUFFERS). Pilihan BUFFERS melaporkan perbezaan antara capaian cache dengan bacaan cakera, yang sangat berguna untuk mendiagnosis pertanyaan yang terhad oleh input/output.

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE customer_id = 42;

Semakan Pantas

Penemuduga menunjukkan kepada anda nod EXPLAIN ANALYZE dengan rows=1000 dalam bahagian kos tetapi actual ... rows=480000. Apakah diagnosis yang paling berkemungkinan?

Ringkasan

Kini anda boleh membaca pelan seperti seorang profesional berpengalaman:

  • EXPLAIN membuat anggaran, manakala EXPLAIN ANALYZE menjalankan dan mengukur.
  • Baca pepohon dari bawah ke atas; nod daun dijalankan dahulu dan nod akar menghasilkan hasil.
  • Setiap nod menunjukkan kos (unit relatif), baris dan lebar; actual time ialah angka sebenar dalam milisaat.
  • loops mendarabkan nombor bagi setiap gelung; beri perhatian kepada gelung bersarang.
  • Jurang antara baris anggaran dengan baris sebenar ialah isyarat diagnostik utama anda.

Huraikan pelan dengan lantang dan nyatakan tanda amarannya; itulah tingkah laku yang memenangi temu duga.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Membaca Pelan EXPLAIN” percuma?

Ya — teks penuh “Membaca Pelan EXPLAIN” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Membaca Pelan EXPLAIN”?

Mentafsir jenis imbasan, kaedah cantuman dan anggaran kos dalam pelan pertanyaan. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Membaca Pelan EXPLAIN” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Membaca Pelan EXPLAIN
  2. Imbasan Berjujukan berbanding Imbasan Indeks berbanding Indeks Sahaja
  3. Algoritma Cantuman: Gelung Bersarang, Cincangan, Cantum
  4. Mengesan dan Membetulkan Pertanyaan Perlahan
← Kembali ke Persediaan Temu Duga Pengaturcaraan