sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvad er forskellen mellem Seq Scan og Bitmap heap-scanning i postgres?

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

Grundlæggende går en sekventiel scanning til de faktiske rækker og begynder at læse fra række 1 og fortsætter, indtil forespørgslen er tilfredsstillet (dette er muligvis ikke hele tabellen, f.eks. i tilfælde af limit)

Bitmap-heap-scanning betyder, at PostgreSQL har fundet en lille delmængde af rækker at hente (f.eks. fra et indeks), og vil kun hente disse rækker. Dette vil selvfølgelig have meget mere søgning, så det er kun hurtigere, når det har brug for en lille delmængde af rækkerne.

Tag et eksempel:

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 kan vi nemt få en seq-scanning:

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)

Den foretog en sekventiel scanning, fordi den anslår, at den vil tage langt størstedelen af ​​bordet; Det ville være fjollet at søge at gøre det (i stedet for en stor, søgeløs læsning).

Nu kan vi bruge indekset:

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)

Og endelig kan vi få nogle bitmap-operationer:

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)

Vi kan læse dette som:

  1. Byg et bitmap af de rækker, vi ønsker for a=4. (Bitmap-indeksscanning)
  2. Byg et bitmap af de rækker, vi ønsker for a=3. (Bitmap-indeksscanning)
  3. Eller de to bitmaps sammen (BitmapEller)
  4. Slå disse rækker op i tabellen (Bitmap Heap Scan), og kontroller, at a=4 eller a=3 (tjek betingelse igen)

[Ja, disse forespørgselsplaner er dumme, men det er fordi vi undlod at analysere test Hvis vi havde analyseret det, ville de alle være sekventielle scanninger, da der er 5 små rækker]




  1. Forespørgsel for at få den laveste værdi, der er større end nul, og er ikke NULL

  2. Top 10 bedste praksis i MySQL

  3. Sådan håndteres markørundtagelse, når udvælgelsesforespørgslen returnerer nul poster

  4. Sådan udfyldes oplysninger i kolonner til e-mail