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_mem
i
SET work_mem = default;
aby ustawić się z work_mem
powrotem na tyle, że jest wystarczająco duża dla mojego zapytania.
WYJAŚNIJ I Sprawdź ponownie Stan
Tak, działa tylko z mojej kwerendy EXPLAIN
jako
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, EXPLAIN
tylko, 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 ANALYZE
w 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 ANALYZE
ujawnia nam bardzo ważne informacje. W małym work_mem
przypadku widzimy, że wiersze są usuwane przez ponowne sprawdzenie indeksu i że mamy lossy
bloki sterty.
Wniosek? (lub jego brak)
Niestety wygląda EXPLAIN
na 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 ANALYZE
jest odpowiednie do diagnozowania problemów z zapytaniami o średniej długości, ale w przypadku, gdy zapytanie zajmuje bardzo dużo czasu, uruchomienie, EXPLAIN ANALYZE
aby przekonać się, że indeks bitmapy przekształca się w stratny z powodu niewystarczającego, work_mem
jest nadal trudnym ograniczeniem. Chciałbym, aby istniał sposób EXPLAIN
oszacowania prawdopodobieństwa tego wystąpienia na podstawie statystyk tabeli.