sql >> Database >  >> RDS >> PostgreSQL

Wat is het verschil tussen Seq Scan en Bitmap heap scan in postgres?

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

Kortom, een sequentiële scan gaat naar de eigenlijke rijen en begint te lezen vanaf rij 1, en gaat door totdat aan de vraag is voldaan (dit hoeft niet de hele tabel te zijn, bijvoorbeeld in het geval van een limiet)

Bitmap-heapscan betekent dat PostgreSQL een kleine subset van rijen heeft gevonden om op te halen (bijvoorbeeld uit een index) en alleen die rijen gaat ophalen. Dit zal natuurlijk veel meer zoeken hebben, dus is alleen sneller als het een kleine subset van de rijen nodig heeft.

Neem een ​​voorbeeld:

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

Nu kunnen we gemakkelijk een seq-scan krijgen:

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)

Het deed een sequentiële scan omdat het schat dat het de overgrote meerderheid van de tafel zal pakken; proberen om dat te doen (in plaats van een grote, zoekloze lezing) zou dwaas zijn.

Nu kunnen we de index gebruiken:

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)

En tot slot kunnen we enkele bitmapbewerkingen uitvoeren:

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)

We kunnen dit lezen als:

  1. Maak een bitmap van de rijen die we willen voor a=4. (Bitmap-indexscan)
  2. Bouw een bitmap van de rijen die we willen voor a=3. (Bitmap-indexscan)
  3. Of de twee bitmaps samen (BitmapOr)
  4. Kijk die rijen omhoog in de tabel (Bitmap Heap Scan) en controleer of a=4 of a=3 (controleer cond)

[Ja, deze queryplannen zijn dom, maar dat komt omdat we de test niet hebben geanalyseerd Als we het hadden geanalyseerd, zouden het allemaal opeenvolgende scans zijn, aangezien er 5 kleine rijen zijn]




  1. Alfanumeriek sorteren met PostgreSQL

  2. FORALL-verklaring met INDICES-OF Bound-clausule in Oracle Database

  3. Een inleiding tot MySQL-implementatie met behulp van een Ansible-rol

  4. hoe waarden uit het selectievakje te halen en door te geven aan een andere jsp-pagina?