Erwin, karena ini adalah diskusi kami di utas komentar sebelumnya, saya memutuskan untuk menyodok sedikit lebih jauh ...
Saya punya pertanyaan yang sangat sederhana dari tabel berukuran cukup. Saya biasanya memiliki cukup work_mem
, tetapi dalam hal ini saya menggunakan perintah
SET work_mem = 64;
untuk mengatur yang sangat kecil work_mem
dan
SET work_mem = default;
untuk mengatur work_mem
kembali saya menjadi cukup besar untuk permintaan saya.
JELASKAN & Kondisi Periksa Ulang
Jadi, jalankan kueri saya hanya EXPLAIN
dengan
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Saya memperoleh hasil untuk rendah & tinggi work_mem
:
Rendah work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
Tinggi work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
Singkatnya, EXPLAIN
hanya untuk , seperti yang diharapkan, rencana kueri menunjukkan bahwa kondisi Periksa ulang dimungkinkan, tetapi kami tidak dapat mengetahui apakah benar-benar akan dihitung.
ANALISIS JELAS & Periksa Kondisi
Saat kami memasukkan ANALYZE
dalam kueri, hasilnya menelpon kami lebih lanjut tentang apa yang perlu kami ketahui.
Rendah work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Rows Removed by Index Recheck: 86727
Heap Blocks: exact=598 lossy=836
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
Index Cond: (meter < 20)
Tinggi work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Heap Blocks: exact=1434
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
Index Cond: (meter < 20)
Sekali lagi, seperti yang diharapkan, penyertaan ANALYZE
mengungkapkan kepada kami beberapa informasi yang sangat penting. Dalam work_mem
kasus rendah , kita melihat bahwa ada baris yang dihapus oleh indeks periksa kembali, dan bahwa kita memiliki lossy
blok tumpukan.
Kesimpulan? (atau ketiadaan)
Sayangnya, sepertinya EXPLAIN
sendiri adalah tidak cukup untuk mengetahui apakah recheck indeks akan benar-benar diperlukan karena beberapa baris id ini sedang jatuh dalam mendukung halaman mempertahankan selama pemindaian bitmap tumpukan.
Penggunaan EXPLAIN ANALYZE
tidak masalah untuk mendiagnosis masalah dengan kueri panjang sedang, tetapi dalam hal kueri membutuhkan waktu yang sangat lama untuk diselesaikan, kemudian jalankan EXPLAIN ANALYZE
untuk mengetahui bahwa indeks bitmap Anda dikonversi menjadi lossy karena tidak mencukupi work_mem
masih merupakan kendala yang sulit. Saya berharap ada cara untuk EXPLAIN
memperkirakan kemungkinan kejadian ini dari tabel statistik.