Qual é a diferença entre Seq Scan and pilha Bitmap digitalizar em postgres?

votos
43

Na saída do comando explicar Eu encontrei dois termos 'Seq Scan' e 'pilha Bitmap Scan'. Alguém pode me dizer qual é a diferença entre estes dois tipos de varredura? (Eu estou usando PostgreSQL)

Publicado 04/01/2009 em 07:52
fonte usuário
Em outras línguas...                            


1 respostas

votos
65

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

Basicamente, uma varredura sequencial é ir para as linhas reais, e começar a ler a partir de linha 1, e continuar até que a consulta está satisfeito (isso pode não ser a tabela inteira, por exemplo, no caso de limite)

varredura montão de mapa de bits significa que o PostgreSQL tem encontrado um pequeno subconjunto de linhas para buscar (por exemplo, a partir de um índice), e vai buscar apenas as linhas. Isto, claro, tem muito mais a busca, então é mais rápido apenas quando ele precisa de um pequeno subconjunto das linhas.

Tomemos 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 seguintes:

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 a sua vai agarrar a grande maioria da mesa; buscando fazer isso (em vez de um grande, seekless ler) seria tolo.

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 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. Construir um bitmap das linhas que queremos para a = 4. (Índice de digitalização de mapa de bits)
  2. Construir um bitmap das linhas que queremos para a = 3. (Índice de digitalização de mapa de bits)
  3. Ou os dois bitmaps juntos (BitmapOr)
  4. Olhe as linhas-se na tabela (Bitmap Heap Scan) e certifique-se de um (cond reverificação) = 4 ou a = 3

[Sim, esses planos de consulta são estúpidos, mas isso é porque nós não analisou testSe tivéssemos analisado, eles estaria tudo varreduras seqüenciais, uma vez que existem 5 linhas minúsculas]

Respondeu 04/01/2009 em 09:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more