Erwin, ponieważ była to nasza dyskusja w wątku komentarza z wcześniej, postanowiłem pogłaskać ją trochę dalej ...
Mam bardzo proste zapytanie z rozsądnej wielkości tabeli. Zazwyczaj mam wystarczające work_mem, ale w tym przypadku użyłem poleceń
SET work_mem = 64;
ustawić bardzo małe work_memi
SET work_mem = default;
aby ustawić się z work_mempowrotem na tyle, że jest wystarczająco duża dla mojego zapytania.
WYJAŚNIJ I Sprawdź ponownie Stan
Tak, działa tylko z mojej kwerendy EXPLAINjako
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Otrzymałem wyniki zarówno dla niskich, jak i wysokich work_mem:
Niska 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)
Wysoki 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)
Krótko mówiąc, EXPLAINtylko, zgodnie z oczekiwaniami, plan zapytań wskazuje, że warunek ponownego sprawdzenia jest możliwy, ale nie wiemy, czy zostanie obliczony.
OBJAŚNIJ ANALIZĘ i ponownie sprawdź stan
Po uwzględnieniu ANALYZEw zapytaniu wyniki przekazują nam więcej informacji na temat tego, co musimy wiedzieć.
Niska 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)
Wysoki 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)
Ponownie, zgodnie z oczekiwaniami, włączenie ANALYZEujawnia nam bardzo ważne informacje. W małym work_memprzypadku widzimy, że wiersze są usuwane przez ponowne sprawdzenie indeksu i że mamy lossybloki sterty.
Wniosek? (lub jego brak)
Niestety wygląda EXPLAINna to, że sam w sobie nie wystarczy wiedzieć, czy ponowne sprawdzenie indeksu będzie faktycznie konieczne, ponieważ niektóre identyfikatory wierszy są odrzucane na rzecz zachowania stron podczas skanowania sterty bitmap.
Używanie EXPLAIN ANALYZEjest odpowiednie do diagnozowania problemów z zapytaniami o średniej długości, ale w przypadku, gdy zapytanie zajmuje bardzo dużo czasu, uruchomienie, EXPLAIN ANALYZEaby przekonać się, że indeks bitmapy przekształca się w stratny z powodu niewystarczającego, work_memjest nadal trudnym ograniczeniem. Chciałbym, aby istniał sposób EXPLAINoszacowania prawdopodobieństwa tego wystąpienia na podstawie statystyk tabeli.