Spróbuję wyjaśnić moje nieporozumienia następującym przykładem.
I nie rozumiem podstaw Spośród Bitmap Heap Scan Node
. Rozważ zapytanie, SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
którego plan jest następujący:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
Moje rozumienie tego węzła :
Jak wyjaśniono tam , bitmap heap scan
odczytuje bloki tabeli w kolejności sekwencyjnej, więc nie generuje narzutu związanego z dostępem do tabeli losowej, co dzieje się tak, jak w przypadku zwykłego Index Scan
.
Po wykonaniu Index Scan
tej czynności PostgreSQL nie wie, jak optymalnie pobrać wiersze, aby uniknąć niepotrzebnego heap blocks reads
(lub hits
jeśli istnieje gorąca pamięć podręczna). Aby to rozgryźć, generuje wywołaną strukturę ( Bitmap Index Scan
), bitmap
która w moim przypadku jest generowana przez wygenerowanie dwóch bitmap indeksów i wykonanie BITWISE AND
. Ponieważ bitmapa została wygenerowana, może teraz optymalnie odczytywać tabelę w kolejności sekwencyjnej, unikając niepotrzebnych heap I/O-operations
.
To miejsce, gdzie pojawia się wiele pytań.
PYTANIE: Mamy tylko mapę bitową. Skąd PostgreSQL za pomocą mapy bitowej wie cokolwiek o fizycznej kolejności wierszy? Czy generuje mapę bitową, aby każdy jej element można było łatwo mapować na wskaźnik do strony? Jeśli tak, to wszystko wyjaśnia, ale to tylko moje przypuszczenia.
Czy możemy więc powiedzieć po prostu, że bitmap heap scan -> bitmap index scan
jest to skanowanie sekwencyjne, ale tylko odpowiedniej części tabeli?
001001010101011010101
. Czy to właściwie nie ma znaczenia i wszystko, co musimy wiedzieć, to po prostu, że potrafi znaleźć blok za pomocą bitmapy w dość szybki sposób ...?