PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Qual é a diferença entre Seq Scan e Bitmap heap scan no postgres?


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

Basicamente, uma varredura sequencial vai para as linhas reais e começa a ler a partir da linha 1 e continua até que a consulta seja satisfeita (isso pode não ser a tabela inteira, por exemplo, no caso de limite)

A varredura de heap de bitmap significa que o PostgreSQL encontrou um pequeno subconjunto de linhas para buscar (por exemplo, de um índice), e vai buscar apenas essas linhas. Obviamente, isso terá muito mais busca, portanto, é mais rápido apenas quando precisa de um pequeno subconjunto das linhas.

Tome um exemplo:
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);

Agora, podemos facilmente obter uma varredura 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)

Ele fez uma varredura sequencial porque estima que vai ocupar a grande maioria da tabela; procurar fazer isso (em vez de uma leitura grande e sem buscas) seria bobagem.

Agora podemos usar o índice:
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)

E, finalmente, podemos obter algumas operações de 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)

Podemos ler isso como:
  1. Crie um bitmap das linhas que queremos para a=4. (Verificação de índice de bitmap)
  2. Crie um bitmap das linhas que queremos para a=3. (Verificação de índice de bitmap)
  3. Ou os dois bitmaps juntos (BitmapOr)
  4. Procure essas linhas na tabela (Bitmap Heap Scan) e verifique se a=4 ou a=3 (verifique novamente cond)

[Sim, esses planos de consulta são estúpidos, mas isso é porque não conseguimos analisar test Se tivéssemos analisado, todos seriam varreduras sequenciais, já que existem 5 linhas minúsculas]