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_memdan
SET work_mem = default;
untuk mengatur work_memkembali saya menjadi cukup besar untuk permintaan saya.
JELASKAN & Kondisi Periksa Ulang
Jadi, jalankan kueri saya hanya EXPLAINdengan
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, EXPLAINhanya 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 ANALYZEdalam 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 ANALYZEmengungkapkan kepada kami beberapa informasi yang sangat penting. Dalam work_memkasus rendah , kita melihat bahwa ada baris yang dihapus oleh indeks periksa kembali, dan bahwa kita memiliki lossyblok tumpukan.
Kesimpulan? (atau ketiadaan)
Sayangnya, sepertinya EXPLAINsendiri 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 ANALYZEtidak masalah untuk mendiagnosis masalah dengan kueri panjang sedang, tetapi dalam hal kueri membutuhkan waktu yang sangat lama untuk diselesaikan, kemudian jalankan EXPLAIN ANALYZEuntuk mengetahui bahwa indeks bitmap Anda dikonversi menjadi lossy karena tidak mencukupi work_memmasih merupakan kendala yang sulit. Saya berharap ada cara untuk EXPLAINmemperkirakan kemungkinan kejadian ini dari tabel statistik.