49 votes

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

En sortie de la commande explicitement, j'ai trouvé deux termes 'Seq Scan' et 'Bitmap heap Scan'. Quelqu'un peut-il me dire quelle est la différence entre ces deux types d'analyse? (J'utilise PostgreSql)

70voto

derobert Points 26258

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

Fondamentalement, un balayage séquentiel va les lignes réelles, et commencer la lecture à partir de la ligne 1, et continuer jusqu'à ce que la requête soit satisfaite (cela peut ne pas être la totalité de la table, par exemple, dans le cas de la limite)

Bitmap tas d'analyse signifie que PostgreSQL a trouvé un petit sous-ensemble de lignes à extraire (par exemple, à partir d'un index), et va chercher uniquement les lignes. Ce sera bien sûr beaucoup plus de recherche, est donc plus rapide seulement quand 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 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)

Il a fait un balayage séquentiel, car il estime sa va saisir la grande majorité de la table, cherchant à le faire (au lieu d'un grand, seekless lire) serait ridicule.

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 une image des opérations:

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)

On peut lire ceci:

  1. Construire une image de l'lignes nous voulons pour a=4. (Bitmap index scan)
  2. Construire une image de l'lignes nous voulons pour a=3. (Bitmap index scan)
  3. Ou les deux images ensemble (BitmapOr)
  4. Regardez ces lignes dans le tableau (Bitmap Tas de Numérisation) et assurez-vous que un=4 soit a=3 (vérifiez cond)

[Oui, ces plans de requête sont stupides, mais c'est parce que nous n'avons pas à analyser test A nous avons analysé, ils allaient tous être analyses séquentielles, comme il y a 5 minuscules lignes]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X