Prestasi PostgreSQL & Pengoptimuman Pertanyaan · Pelajaran

Cara Perancang Menganggar Bilangan Baris

Jejaki anggaran kejelasan daripada pg_statistic hingga kardinaliti yang mempengaruhi pilihan pelan.

Pelajaran 1 daripada 413 langkah

Cara Perancang Menganggar Bilangan Baris ialah pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Sebab Anggaran Baris Mendorong Segala-galanya

Sebelum PostgreSQL melaksanakan pertanyaan, perancang mesti menentukan cara untuk menjalankannya: imbasan berjujukan berbanding imbasan indeks, gelung bersarang berbanding cantuman cincangan, dan jadual mana yang menjadi pemacu cantuman. Setiap keputusan ini bergantung pada satu tekaan: berapa banyak baris yang akan dihasilkan oleh setiap langkah?

  • Jika perancang menganggap penapis mengembalikan 5 baris, imbasan indeks + gelung bersarang kelihatan murah.
  • Jika perancang menganggap penapis yang sama mengembalikan 5 juta baris, imbasan berjujukan + cantuman cincangan adalah lebih baik.

Tekaan bilangan baris ini dipanggil anggaran kardinaliti. Apabila anggaran ini salah, perancang memilih pelan yang buruk walaupun model kosnya betul sepenuhnya. Pelajaran ini menjejaki dengan tepat dari mana datangnya angka tersebut.

Membaca Anggaran daripada EXPLAIN

Setiap nod dalam pelan EXPLAIN melaporkan anggaran perancang. Nilai rows= ialah kardinaliti anggaran bagi nod tersebut. Jalankan EXPLAIN ANALYZE untuk membandingkannya dengan kiraan sebenar.

  • (cost=… rows=120 …) ialah anggaran.
  • (actual … rows=118 …) ialah nilai sebenar.

Jurang besar antara baris yang dianggarkan dengan baris sebenar ialah punca utama yang paling biasa bagi pelan yang perlahan. Latih mata anda untuk mencarinya terlebih dahulu.

EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE status = 'shipped'
  AND country = 'DE';

Tempat Angka Disimpan: pg_statistic

Perancang tidak melihat data anda pada masa merancang pelan. Perancang membaca ringkasan yang telah dikira daripada katalog sistem pg_statistic, yang diisi oleh ANALYZE (dijalankan secara automatik oleh autovacuum). Paparan yang mudah dibaca manusia untuknya ialah pg_stats.

Bagi setiap lajur, pg_stats mendedahkan komponen asas untuk penganggaran:

  • null_frac — pecahan nilai NULL.
  • n_distinct — bilangan nilai berbeza.
  • most_common_vals / most_common_freqs — senarai MCV.
  • histogram_bounds — kelompok untuk baki nilai bukan MCV.
SELECT attname, null_frac, n_distinct,
       most_common_vals, most_common_freqs
FROM pg_stats
WHERE tablename = 'orders'
  AND attname = 'status';

Selektiviti: Pecahan Teras

Selektiviti ialah pecahan baris yang dianggarkan dikekalkan oleh sesuatu predikat, antara 0 dan 1. Bilangan baris yang dianggarkan ialah:

  • estimated_rows = selectivity × total_rows

di mana total_rows datang daripada pg_class.reltuples (turut dikemas kini oleh ANALYZE). Jadi, penganggaran beralih kepada dua soalan: berapakah bilangan baris dalam jadual, dan apakah pecahan yang kekal selepas setiap predikat? Selebihnya ialah perincian tentang cara pecahan itu dikira.

SELECT relname, reltuples::bigint AS est_rows, relpages
FROM pg_class
WHERE relname = 'orders';

Kesamaan pada Nilai Lazim: Senarai MCV

Untuk column = 'value', perancang terlebih dahulu menyemak senarai most_common_vals (MCV). Jika nilai itu ada dalam senarai, perancang menggunakan kekerapan tepat daripada most_common_freqs — tiada pengiraan matematik, hanya carian.

Contoh: jika most_common_vals = {shipped, pending, cancelled} dan most_common_freqs = {0.62, 0.25, 0.08}, maka status = 'shipped' mempunyai selektiviti 0.62. Dalam jadual dengan 1,000,000 baris, anggarannya ialah 620,000 baris.

MCV menjadikan penganggaran taburan yang condong lebih tepat — perancang mengetahui dengan tepat betapa lazimnya nilai yang sangat kerap muncul.

-- shipped is an MCV: selectivity = its stored frequency
SELECT most_common_vals, most_common_freqs
FROM pg_stats
WHERE tablename = 'orders' AND attname = 'status';

Kesamaan pada Nilai Jarang: Baki

Jika nilai itu tidak terdapat dalam senarai MCV, perancang mengandaikan semua nilai bukan MCV mempunyai kebarangkalian yang sama. Perancang mengira baki kebarangkalian lalu membahagikannya secara sama rata:

  • residual = 1 − sum(most_common_freqs) − null_frac
  • n_distinct_residual = n_distinct − count(MCVs)
  • selectivity = residual / n_distinct_residual

Inilah sebabnya anggaran bagi nilai jarang boleh menjadi kurang tepat apabila ekor panjang itu sendiri condong: andaian seragam dalam baki tidak lagi sesuai. MCV meliputi bahagian utama; baki ialah anggaran rata bagi ekor taburan.

Predikat Julat: Histogram

Untuk ketaksamaan seperti amount > 500 atau created_at BETWEEN …, perancang menggunakan histogram_bounds. Sempadan ini membahagikan nilai bukan MCV kepada kelompok yang setiap satunya mengandungi kira-kira bilangan baris yang sama (kedalaman sama, bukan lebar sama).

Untuk menganggarkan amount < X, perancang mencari kedudukan X antara sempadan lalu membuat interpolasi linear dalam kelompok yang mengandungi nilai itu. Dengan N kelompok, setiap kelompok mewakili kira-kira 1/N daripada baris bukan MCV. Oleh itu, perancang mengira kelompok penuh di bawah X serta sebahagian daripada kelompok sempadan.

SELECT histogram_bounds
FROM pg_stats
WHERE tablename = 'orders' AND attname = 'amount';

Menggabungkan Predikat: Perangkap Andaian Kebebasan

Dengan berbilang syarat AND pada lajur yang berbeza, PostgreSQL mendarabkan selektiviti dengan mengandaikan lajur tersebut bebas secara statistik:

  • sel(A AND B) = sel(A) × sel(B)

Jika status = 'shipped' ialah 0.62 dan country = 'DE' ialah 0.10, perancang menganggarkan 0.062 daripada jadual. Namun, jika pesanan yang dihantar kebanyakannya dari Jerman, pecahan sebenar mungkin 0.30 — anggaran terkurang sebanyak 5 kali ganda. Lajur yang berkorelasi ialah keadaan apabila statistik satu lajur gagal dan pelan runtuh.

EXPLAIN
SELECT * FROM orders
WHERE status = 'shipped'   -- sel ≈ 0.62
  AND country = 'DE';      -- sel ≈ 0.10  →  planner guesses 0.062

Membetulkan Korelasi: Statistik Lanjutan

Apabila lajur berkorelasi, cipta statistik lanjutan dengan CREATE STATISTICS. Jenis dependencies mengajar perancang tentang kebergantungan fungsi; mcv menyimpan gabungan nilai paling lazim bagi berbilang lajur supaya predikat AND dianggarkan secara bersama, bukannya didarabkan.

Selepas mencipta objek tersebut, anda mesti menjalankan ANALYZE pada jadual untuk mengisinya. Kemudian perancang membaca taburan bersama dan berhenti mengandaikan kebebasan bagi lajur tersebut.

CREATE STATISTICS orders_status_country (dependencies, mcv)
  ON status, country
  FROM orders;

ANALYZE orders;

Cantuman: Menyebarkan Kardinaliti

Bilangan baris hasil cantuman dibina berdasarkan anggaran bagi setiap jadual. Untuk cantuman kesamaan, PostgreSQL menganggarkan baris hasil secara kasar seperti berikut:

  • rows ≈ (outer_rows × inner_rows) / max(n_distinct_outer, n_distinct_inner)

dengan menggunakan n_distinct kunci cantuman daripada kedua-dua sisi. Inilah sebabnya anggaran satu jadual yang buruk merebak: jika perancang menyangka sisi yang ditapis mempunyai 5 baris sedangkan sebenarnya mempunyai 50,000, setiap cantuman di atasnya mewarisi ralat itu dan mungkin memilih gelung bersarang yang berjalan 50,000 kali dan bukannya cantuman cincangan.

EXPLAIN ANALYZE
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.country = 'DE';

Mengekalkan Ketepatan Anggaran

Ketepatan anggaran bergantung sepenuhnya pada statistik yang mendasarinya. Langkah praktikal:

  • Jalankan ANALYZE selepas pemuatan pukal; biarkan autovacuum memastikan statistik sentiasa terkini.
  • Tingkatkan resolusi pada lajur yang condong dengan ALTER TABLE … ALTER COLUMN … SET STATISTICS n (senarai MCV dan histogram yang lebih besar).
  • Tambah CREATE STATISTICS untuk kumpulan lajur yang berkorelasi.
  • Bandingkan baris yang dianggarkan dengan baris sebenar menggunakan EXPLAIN ANALYZE untuk mencari nod tempat tekaan mula tersasar.

Nyahpepijat dari bahagian bawah pelan ke atas: nod pertama dengan jurang besar antara anggaran dan keadaan sebenar biasanya ialah punca sebenar.

ALTER TABLE orders ALTER COLUMN amount SET STATISTICS 500;
ANALYZE orders;

Semakan Pantas: Menggabungkan Selektiviti

Terapkan peraturan penganggaran pada kes yang nyata.

Imbas Kembali: Daripada Katalog kepada Kardinaliti

Kini anda boleh menjejaki anggaran baris dari awal hingga akhir:

  • ANALYZE mengisi pg_statistic / pg_stats dan menetapkan reltuples.
  • Kesamaan menggunakan senarai MCV apabila nilai itu lazim; jika tidak, ia menggunakan baki seragam berdasarkan n_distinct.
  • Julat membuat interpolasi dalam histogram_bounds yang mempunyai kedalaman sama.
  • Berbilang AND mendarabkan selektiviti dengan mengandaikan kebebasan — sumber utama ralat penganggaran.
  • Statistik lanjutan (dependencies, mcv) membetulkan lajur yang berkorelasi.
  • Cantuman menggabungkan anggaran setiap sisi melalui n_distinct kunci cantuman, maka ralat satu jadual merebak ke atas.

Selektiviti × bilangan baris menghasilkan kardinaliti yang mempengaruhi pilihan imbasan, cantuman dan susunan. Kuasai perkara ini dan output EXPLAIN tidak lagi menjadi misteri — ia menjadi cerita yang boleh anda baca.

Percuma untuk bermula

Pelajari SQL 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
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Cara Perancang Menganggar Bilangan Baris” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan, termasuk “Cara Perancang Menganggar Bilangan Baris”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Cara Perancang Menganggar Bilangan Baris”?

Jejaki anggaran kejelasan daripada pg_statistic hingga kardinaliti yang mempengaruhi pilihan pelan. Anda berlatih Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan 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 Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan 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 “Cara Perancang Menganggar Bilangan Baris” 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 Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan ini?

Ya. Setiap pelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan 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. Cara Perancang Menganggar Bilangan Baris
  2. Statistik Pelbagai Pemboleh Ubah untuk Lajur Berkorelasi
  3. Pembetulan MCV dan N-Distinct
  4. Mengesahkan Anggaran Berbanding Baris Sebenar
← Kembali ke Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan