http://www.postgresql.org/docs/8.2/static /using-explain.html
Zasadniczo skanowanie sekwencyjne przechodzi do rzeczywistych wierszy i zaczyna czytać od wiersza 1 i kontynuuje, aż zapytanie zostanie spełnione (może to nie być cała tabela, np. w przypadku limitu)
Skanowanie sterty bitmapowej oznacza, że PostgreSQL znalazł mały podzbiór wierszy do pobrania (np. z indeksu) i będzie pobierał tylko te wiersze. Będzie to oczywiście miało znacznie więcej poszukiwań, więc jest szybsze tylko wtedy, gdy potrzebuje małego podzbioru wierszy.
Weź przykład:
create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);
Teraz możemy łatwo uzyskać seq scan:
explain select * from test where a != 4
QUERY PLAN
---------------------------------------------------------
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12)
Filter: (a <> 4)
Zrobił skan sekwencyjny, ponieważ szacuje, że zdobędzie większość stołu; próba zrobienia tego (zamiast dużej, beznadziejnej lektury) byłaby głupia.
Teraz możemy użyć indeksu:
explain select * from test where a = 4 ;
QUERY PLAN
----------------------------------------------------------------------
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 4)
I na koniec możemy uzyskać kilka operacji bitmapowych:
explain select * from test where a = 4 or a = 3;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12)
Recheck Cond: ((a = 4) OR (a = 3))
-> BitmapOr (cost=8.52..8.52 rows=2 width=0)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 4)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 3)
Możemy to przeczytać jako:
- Zbuduj mapę bitową wierszy, które chcemy dla a=4. (Skanowanie indeksu mapy bitowej)
- Zbuduj bitmapę wierszy, które chcemy dla a=3. (Skanowanie indeksu mapy bitowej)
- Lub dwie bitmapy razem (BitmapOr)
- Sprawdź te wiersze w tabeli (Skanowanie sterty bitmapy) i upewnij się, że a=4 lub a=3 (sprawdź ponownie warunki)
[Tak, te plany zapytań są głupie, ale to dlatego, że nie przeanalizowaliśmy test
Gdybyśmy to przeanalizowali, wszystkie byłyby skanami sekwencyjnymi, ponieważ jest 5 małych wierszy]