PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist der Unterschied zwischen Seq-Scan und Bitmap-Heap-Scan in Postgres?

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

Grundsätzlich geht ein sequenzieller Scan zu den tatsächlichen Zeilen und beginnt mit dem Lesen von Zeile 1 und fährt fort, bis die Abfrage erfüllt ist (dies ist möglicherweise nicht die gesamte Tabelle, z. B. im Fall von limit)

Bitmap-Heap-Scan bedeutet, dass PostgreSQL eine kleine Teilmenge von Zeilen zum Abrufen gefunden hat (z. B. aus einem Index) und nur diese Zeilen abrufen wird. Dies erfordert natürlich viel mehr Suchvorgänge und ist daher nur dann schneller, wenn eine kleine Teilmenge der Zeilen benötigt wird.

Nehmen Sie 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 ganz einfach einen Seq-Scan 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 durchgeführt, weil es davon ausgeht, dass es die überwiegende Mehrheit des Tisches erobern wird; Das zu versuchen (anstelle eines großen, sinnlosen Lesens) wäre albern.

Jetzt können wir den Index verwenden:

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:

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 lesen als:

  1. Erstellen Sie eine Bitmap der gewünschten Zeilen für a=4. (Bitmap-Index-Scan)
  2. Erstellen Sie eine Bitmap der gewünschten Zeilen für a=3. (Bitmap-Index-Scan)
  3. Oder die beiden Bitmaps zusammen (BitmapOr)
  4. Schauen Sie diese Zeilen in der Tabelle nach (Bitmap Heap Scan) und prüfen Sie, ob a=4 oder a=3 ist (Bedingung erneut prüfen)

[Ja, diese Abfragepläne sind dumm, aber das liegt daran, dass wir test nicht analysiert haben Hätten wir es analysiert, wären sie alle sequentielle Scans, da es 5 winzige Zeilen gibt]