O que é uma “varredura de heap de bitmap” em um plano de consulta?

113

Eu quero saber o princípio da "verificação de heap de bitmap", sei que isso geralmente acontece quando executo uma consulta com ORa condição.

Quem pode explicar o princípio por trás de uma "varredura de heap de bitmap"?

francos
fonte

Respostas:

122

A melhor explicação vem de Tom Lane , que é o autor do algoritmo, a menos que eu esteja enganado. Veja também o artigo da Wikipedia .

Resumindo, é um pouco como uma varredura de sequência. A diferença é que, em vez de visitar todas as páginas do disco, um índice de bitmap verifica os ANDs e ORs dos índices aplicáveis ​​juntos e só visita as páginas do disco de que precisa.

Isso é diferente de uma varredura de índice, onde o índice é visitado linha por linha em ordem - o que significa que uma página do disco pode ser visitada várias vezes.


Re: a pergunta em seu comentário ... Sim, é exatamente isso.

Uma varredura de índice percorrerá as linhas uma a uma, abrindo as páginas do disco repetidamente, quantas vezes forem necessárias (algumas, é claro, ficarão na memória, mas você entendeu).

Uma varredura de índice de bitmap abrirá sequencialmente uma pequena lista de páginas de disco e pegará todas as linhas aplicáveis ​​em cada uma (daí a chamada condição de nova verificação que você vê nos planos de consulta).

Observe, como um aparte, como o agrupamento / ordem das linhas afeta os custos associados a qualquer um dos métodos. Se as linhas estiverem espalhadas por toda parte em uma ordem aleatória, um índice de bitmap será mais barato. (E, de fato, se eles estiverem realmente em todos os lugares, uma varredura seq será mais barata, já que uma varredura de índice de bitmap não ocorre sem alguma sobrecarga.)

Denis de Bernardy
fonte
Portanto, "Verificação de heap de bitmap": uma página não pode ser visitada mais de uma vez! mas "O índice pode": uma página pode ser visitada mais de uma vez, porque o índice é visitado linha por linha em ordem.
francos
Provavelmente há cache envolvido quando as páginas são visitadas várias vezes: a página será realmente carregada do disco na primeira vez (lento) e o acesso posterior irá atingir o cache na memória (cache Postgres (rápido) ou cache do sistema operacional (mais rápido)) .
Matthieu,
Também existe o index-only scanquando apenas a coluna indexada é acessada na consulta. neste caso, index-only scannão precisa acessar os dados do heap (página de dados): postgresql.org/docs/12/indexes-index-only-scans.html
Alan