Trataré de explicar mis malentendidos con el siguiente ejemplo.
No entendí los fundamentos de la Bitmap Heap Scan Node
. Considere la consulta SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
cuyo plan es 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)
Mi comprensión de este nodo :
Como se explica allí , la bitmap heap scan
tabla de lectura se bloquea en orden secuencial, por lo que no produce una sobrecarga de acceso aleatorio a la tabla, lo que sucede simplemente Index Scan
.
Una Index Scan
vez hecho esto, PostgreSQL no sabe cómo recuperar las filas de manera óptima, para evitar el acceso innecesario heap blocks reads
(o hits
si hay una caché activa). Entonces, para descubrirlo, genera la estructura ( Bitmap Index Scan
) llamada bitmap
que en mi caso se genera al generar dos mapas de bits de los índices y realizarlos BITWISE AND
. Dado que el mapa de bits se ha generado, ahora puede leer la tabla de manera óptima en un orden secuencial, evitando innecesarios heap I/O-operations
.
Ese es el lugar donde surgen muchas preguntas.
PREGUNTA: Tenemos solo un mapa de bits. ¿Cómo sabe PostgreSQL con solo un mapa de bits algo sobre el orden físico de las filas? ¿O genera el mapa de bits para que cualquier elemento del mismo pueda asignarse fácilmente al puntero a una página? Si es así, eso lo explica todo, pero es solo mi suposición.
Entonces, ¿podemos decir simplemente que bitmap heap scan -> bitmap index scan
es como un escaneo secuencial pero solo de la parte apropiada de la tabla?
001001010101011010101
. ¿O en realidad no importa y todo lo que tenemos que saber es que puede encontrar un bloque por su mapa de bits de una manera bastante rápida ...?