41

In der Ausgabe von EXPLAIN habe ich zwei Begriffe 'Seq Scan' und 'Bitmap Heap Scan' gefunden. Kann mir jemand sagen, was der Unterschied zwischen diesen beiden Scanarten ist? (Ich bin mit PostgreSql)Was ist der Unterschied zwischen Seq Scan und Bitmap Heap Scan in Postgres?

+2

um es einfach auszudrücken „, seq scan "verwendet keine Indizes (normalerweise langsamer) und alle anderen Scans versuchen, die in der Tabelle definierten Indizes zu verwenden. – Gnudiff

Antwort

65

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

Grundsätzlich ist ein sequentieller Scan zu den tatsächlichen Zeilen geht, und starten aus Reihe liest 1, und weiter, bis die Abfrage erfüllt ist (dies ist nicht die gesamte Tabelle sein kann, (zB im Falle eines Limits)

Bitmap-Heap-Scan bedeutet, dass PostgreSQL eine kleine Teilmenge von Zeilen gefunden hat (z. B. von einem Index) und nur diese Zeilen abruft. Dies wird natürlich viel mehr suchen, ist also nur schneller, wenn es eine kleine Teilmenge der Zeilen benötigt.

Nehmen wir ein Beispiel:

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); 

Jetzt können wir leicht eine seq scannen erhalten:

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) 

Es hat einen sequentiellen Scan, weil er schätzt seine die überwiegende Mehrheit der Tabelle greifen gehen ; das zu tun (statt eines großen, suchlosen Lesens) wäre albern.

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) 

Und schließlich können wir einige Bitmap-Operationen erhalten:

Jetzt können wir den Index verwenden können

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) 

Wir können dies als lesen:

  1. ein Bauen Bitmap der Zeilen, die wir für a = 4 wollen. (Bitmap Index Scan)
  2. Erstellen Sie eine Bitmap der Zeilen, die wir für a = 3 wollen. (Bitmap-Index-Scan)
  3. Oder die beiden Bitmaps zusammen (BitmapOr)
  4. Schauen Sie diese Zeilen nach oben in der Tabelle (Bitmap Heap Scan) und prüfen Sie, a = 4 oder a = 3 (Neuprüfung cond) machen

[Ja, diese Abfrage-Pläne sind dumm, aber das ist, weil wir uns analysierten sie analysieren gescheitert test hatten, sie alle sequenzielle Scans sein würde, da es 5 winzige Zeilen]

+1

Oder ein Bitmap-Scan kann auch eine Untermenge von Index-Scans sein. – WolfmanDragon

+0

@derobert, was meinst du mit "suchen"? Kann nirgendwo eine Erwähnung finden ... – zapadlo

+1

@Zapadlo Suche wie in einer Festplatte suchen, z. B. wahlfreien Zugriff statt sequentiell. – derobert