sql >> Databasteknik >  >> RDS >> PostgreSQL

Vad är skillnaden mellan Seq Scan och Bitmap heap scan i postgres?

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

I grund och botten går en sekventiell skanning till de faktiska raderna och börjar läsa från rad 1 och fortsätter tills frågan är nöjd (detta kanske inte är hela tabellen, t.ex. i fallet med limit)

Bitmap heap scan betyder att PostgreSQL har hittat en liten delmängd av rader att hämta (t.ex. från ett index), och kommer bara att hämta dessa rader. Detta kommer naturligtvis att ha mycket mer sökning, så det är snabbare bara när det behöver en liten delmängd av raderna.

Ta ett exempel:

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 enkelt få en seq scan:

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 gjorde en sekventiell skanning eftersom den uppskattar att den kommer att ta den stora majoriteten av bordet; att försöka göra det (istället för en stor, orolig läsning) skulle vara dumt.

Nu kan vi använda indexet:

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)

Och slutligen kan vi få några bitmappsoperationer:

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äsa detta som:

  1. Skapa en bitmapp av raderna vi vill ha för a=4. (Bitmap index scan)
  2. Skapa en bitmapp av raderna vi vill ha för a=3. (Bitmap index scan)
  3. Eller de två bitmapparna tillsammans (BitmapOr)
  4. Slå upp dessa rader i tabellen (Bitmap Heap Scan) och kontrollera att a=4 eller a=3 (kontrollera villkoret igen)

[Ja, de här frågeplanerna är dumma, men det beror på att vi misslyckades med att analysera test Hade vi analyserat det, skulle de alla vara sekventiella skanningar, eftersom det finns 5 små rader]




  1. överföra kolumner till rader

  2. Rails + MySQL på Mavericks - Biblioteket är inte laddat:libmysqlclient.18.dylib

  3. Om man ska använda SET NAMES

  4. "Kunde inte hitta pg-0.12.2 i någon av källorna" när du kör rspec