Erwin, bu daha önce yaptığımız yorum dizisindeki tartışmamız olduğundan, biraz daha konuşmaya karar verdim ...
Makul boyutlu bir tablodan çok basit bir sorgu var. Tipik olarak yeterliyim work_mem, ama bu durumda komutları kullandım
SET work_mem = 64;
çok küçük work_memve
SET work_mem = default;
Benim ayarlamak için work_memSorgumda yeterince büyük olmasının arkasını.
EXPLAIN ve Yeniden Kontrol Durumu
Yani, sadece benim sorguyu çalıştıran EXPLAINolarak
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Hem düşük hem de yüksek sonuçlar elde ettim work_mem:
Düşük 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)
Yüksek 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)
Uzun lafın kısası, EXPLAIN sadece, beklendiği gibi, sorgu planı bir Recheck koşulunun mümkün olduğunu gösterir, ancak aslında hesaplanıp hesaplanmayacağını bilemeyiz.
AÇIKLAMA ANALİZİ ve Tekrar Kontrol Durumu
ANALYZESorguya dahil ettiğimizde , sonuçlar bize bilmemiz gerekenler hakkında daha fazla bilgi verir.
Düşük 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)
Yüksek 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)
Yine, beklendiği gibi, ANALYZEbize dahil edilmesi çok önemli bazı bilgileri ortaya koymaktadır. Düşük work_memdurumda, dizin yeniden denetimi tarafından kaldırılan satırlar olduğunu ve lossyyığın bloklarımız olduğunu görüyoruz .
Sonuç? (veya eksikliği)
Ne yazık ki, EXPLAINkendi başına bir dizin yeniden denetiminin gerçekten gerekli olup olmayacağını bilmek yeterli görünmüyor , çünkü bazı satır kimlikleri bitmap yığın taraması sırasında sayfaları korumak lehine bırakılıyor.
Kullanımı EXPLAIN ANALYZE, orta uzunluktaki sorgularla ilgili sorunları teşhis etmek için iyidir, ancak bir sorgunun tamamlanması çok uzun zaman EXPLAIN ANALYZEalıyorsa, bitmap dizininizin yetersiz work_memolması nedeniyle kayıplıya dönüştüğünü keşfetmek hala zor bir kısıtlamadır. Keşke EXPLAINbu oluşumun tablo istatistiklerinden tahmin edilmesinin bir yolu olsaydı .