Odpowiedz

65

http://www.postgresql.org/docs/8.2/static/using-explain.html

Zasadniczo, sekwencyjnego skanowania idzie do rzeczywistych wierszy i zacząć czytać od wiersza 1, i dalej, aż kwerenda jest spełniony (nie może to być cała tabela, np. w przypadku limitu)

Skanowanie sterty bitmap oznacza, że ​​PostgreSQL znalazł mały podzestaw wierszy do pobrania (np. z indeksu) i pobierze tylko te wiersze. Będzie to oczywiście miało o wiele więcej poszukiwań, więc jest szybsze tylko wtedy, gdy potrzebuje małego podzestawu wierszy.

Weźmy 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 dostać skanowanie nast:

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) 

To nie sekwencyjnego skanowania, ponieważ szacuje swój zamiar porwać większość stole ; staranie się o to (zamiast dużego, bezmyślnego czytania) byłoby głupie.

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 wreszcie, możemy uzyskać pewne operacje bitmap:

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 odczytać to jako:

  1. Budowanie mapa bitowa żądanych wierszy dla a = 4. (Skanowanie indeksu map bitowych)
  2. Zbuduj bitmapę żądanych wierszy dla a = 3. (Bitmapy skanowania indeksu)
  3. albo dwie bitmapy razem (BitmapOr)
  4. Spójrz te wiersze w tabeli (bitmapy Heap Scan) i upewnij się, a = 4 lub = 3 (ponownie sprawdzić dyr)

[Tak, te plany zapytań są głupie, ale to dlatego, że nie udało się nam analizować test Gdyby przeanalizowaliśmy ją oni, że wszystko będzie kolejne skany, ponieważ istnieje 5 maleńkie wiersze]

+1

Skanowanie bitmapowe może być również podzbiorem skanu indeksu. – WolfmanDragon

+0

@derobert, co masz na myśli przez "poszukiwanie"? Nie można znaleźć żadnej wzmianki o tym w dowolnym miejscu ... – zapadlo

+1

@Zapadlo Szukam jak w poszukiwaniu dysku, np. Losowy dostęp zamiast sekwencyjnego. – derobert

Powiązane problemy