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_mem
ve
SET work_mem = default;
Benim ayarlamak için work_mem
Sorgumda yeterince büyük olmasının arkasını.
EXPLAIN ve Yeniden Kontrol Durumu
Yani, sadece benim sorguyu çalıştıran EXPLAIN
olarak
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
ANALYZE
Sorguya 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, ANALYZE
bize dahil edilmesi çok önemli bazı bilgileri ortaya koymaktadır. Düşük work_mem
durumda, dizin yeniden denetimi tarafından kaldırılan satırlar olduğunu ve lossy
yığın bloklarımız olduğunu görüyoruz .
Sonuç? (veya eksikliği)
Ne yazık ki, EXPLAIN
kendi 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 ANALYZE
alıyorsa, bitmap dizininizin yetersiz work_mem
olması nedeniyle kayıplıya dönüştüğünü keşfetmek hala zor bir kısıtlamadır. Keşke EXPLAIN
bu oluşumun tablo istatistiklerinden tahmin edilmesinin bir yolu olsaydı .