PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quelle est la différence entre Seq Scan et Bitmap heap scan dans postgres ?

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

Fondamentalement, une analyse séquentielle va aux lignes réelles, et commence à lire à partir de la ligne 1, et continue jusqu'à ce que la requête soit satisfaite (cela peut ne pas être la table entière, par exemple, dans le cas d'une limite)

L'analyse du tas bitmap signifie que PostgreSQL a trouvé un petit sous-ensemble de lignes à récupérer (par exemple, à partir d'un index) et va récupérer uniquement ces lignes. Cela aura bien sûr beaucoup plus de recherche, donc n'est plus rapide que lorsqu'il a besoin d'un petit sous-ensemble de lignes.

Prenons un exemple :

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

Maintenant, nous pouvons facilement obtenir un scan seq :

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)

Il a effectué une analyse séquentielle car il estime qu'il va saisir la grande majorité de la table ; chercher à faire cela (au lieu d'une grande lecture sans recherche) serait idiot.

Maintenant, nous pouvons utiliser l'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)

Et enfin, nous pouvons obtenir quelques opérations bitmap :

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)

Nous pouvons lire ceci comme :

  1. Construire un bitmap des lignes que nous voulons pour a=4. (Analyse d'index bitmap)
  2. Construire un bitmap des lignes que nous voulons pour a=3. (Analyse d'index bitmap)
  3. Ou les deux bitmaps ensemble (BitmapOr)
  4. Recherchez ces lignes dans le tableau (Bitmap Heap Scan) et vérifiez que a=4 ou a=3 (revérifiez cond)

[Oui, ces plans de requête sont stupides, mais c'est parce que nous n'avons pas analysé le test Si nous l'avions analysé, ils seraient tous des scans séquentiels, puisqu'il y a 5 petites lignes]