sql >> Databáze >  >> RDS >> PostgreSQL

Jaký je rozdíl mezi Seq Scan a Bitmapovým skenováním haldy v postgresu?

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

Sekvenční skenování v zásadě přechází na skutečné řádky a začíná číst od řádku 1 a pokračuje, dokud není dotaz splněn (nemusí to být celá tabulka, např. v případě limitu)

Bitmapové skenování haldy znamená, že PostgreSQL nalezl malou podmnožinu řádků k načtení (např. z indexu) a chystá se načíst pouze tyto řádky. To bude mít samozřejmě mnohem více vyhledávání, takže je rychlejší pouze v případě, že potřebuje malou podmnožinu řádků.

Vezměte si příklad:

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

Nyní můžeme snadno získat 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)

Provedl sekvenční sken, protože odhaduje, že zabere drtivou většinu tabulky; snažit se o to (místo velkého, nehledaného čtení) by bylo hloupé.

Nyní můžeme použít index:

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)

A nakonec můžeme získat nějaké bitmapové operace:

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)

Můžeme to číst jako:

  1. Sestavte bitmapu řádků, které chceme pro a=4. (skenování indexu bitmapy)
  2. Vytvořte bitmapu řádků, které chceme pro a=3. (skenování indexu bitmapy)
  3. Nebo obě bitmapy dohromady (BitmapOr)
  4. Vyhledejte tyto řádky v tabulce (Bitmap Heap Scan) a zkontrolujte, zda a=4 nebo a=3 (znovu zkontrolujte podmínku)

[Ano, tyto plány dotazů jsou hloupé, ale je to proto, že se nám nepodařilo analyzovat test Kdybychom to analyzovali, všechny by byly sekvenční skenování, protože je tam 5 malých řádků]




  1. Aktualizace MySQL nebo dotaz vložit nebo zemřít

  2. Získejte vnořený objekt ve struktuře v gormu

  3. Jak vložit více řádků do jednoho SQL dotazu – otázka týdne #069

  4. MySQL odstraňuje duplicitní záznamy