Vou tentar explicar meus mal-entendidos pelo exemplo a seguir.
Eu não entendi os fundamentos do Bitmap Heap Scan Node
. Considere a consulta SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
cujo plano é este:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
Meu entendimento deste nó :
Conforme explicado lá , a bitmap heap scan
tabela lê os blocos em ordem sequencial, para que não produza sobrecarga de acesso à tabela aleatória, o que acontece exatamente como acontece Index Scan
.
Depois de Index Scan
feito, o PostgreSQL não sabe como buscar as linhas da melhor maneira, para evitar desnecessários heap blocks reads
(ou hits
se houver um cache quente). Então, para descobrir isso, gera a estrutura ( Bitmap Index Scan
) chamada bitmap
que, no meu caso, está sendo gerada, gerando dois bitmaps dos índices e executando BITWISE AND
. Como o bitmap foi gerado, agora é possível ler a tabela de maneira otimizada em uma ordem seqüencial, evitando desnecessários heap I/O-operations
.
É aí que muitas perguntas surgem.
PERGUNTA: Temos apenas um bitmap. Como o PostgreSQL conhece apenas um bitmap sobre a ordem física das linhas? Ou gera o bitmap para que qualquer elemento dele possa ser mapeado para o ponteiro para uma página facilmente? Se assim for, isso explica tudo, mas é apenas o meu palpite.
Então, podemos dizer simplesmente que bitmap heap scan -> bitmap index scan
é como uma varredura seqüencial, mas apenas da parte apropriada da tabela?
001001010101011010101
. Ou, na verdade, não importa e tudo o que precisamos saber é que ele pode encontrar um bloco pelo bitmap de maneira bastante rápida ...?