¿Qué es un "escaneo de montón de mapa de bits" en un plan de consulta?


113

Quiero conocer el principio de "escaneo de montón de mapa de bits", sé que esto sucede a menudo cuando ejecuto una consulta con ORla condición.

¿Quién puede explicar el principio detrás de un "escaneo de montón de mapa de bits"?

Respuestas:


122

La mejor explicación proviene de Tom Lane , que es el autor del algoritmo, a menos que me equivoque. Consulte también el artículo de wikipedia .

En resumen, es un poco como un escaneo secuencial. La diferencia es que, en lugar de visitar todas las páginas del disco, un índice de mapa de bits analiza los índices AND y OR de forma conjunta, y solo visita las páginas del disco que necesita.

Esto es diferente de un escaneo de índice, donde el índice se visita fila por fila en orden, lo que significa que una página de disco puede ser visitada varias veces.


Re: la pregunta en tu comentario ... Sí, eso es exactamente.

Un escaneo de índice recorrerá las filas una por una, abriendo páginas del disco una y otra vez, tantas veces como sea necesario (algunas, por supuesto, permanecerán en la memoria, pero entiendes el punto).

Un escaneo de índice de mapa de bits abrirá secuencialmente una lista corta de páginas de disco y tomará todas las filas aplicables en cada una (de ahí la llamada condición de verificación que se ve en los planes de consulta).

Tenga en cuenta, además, cómo la agrupación en clústeres / el orden de las filas afecta los costos asociados con cualquiera de los métodos. Si las filas están por todas partes en un orden aleatorio, un índice de mapa de bits será más barato. (Y, de hecho, si realmente están por todas partes, un escaneo seq será más barato, ya que un escaneo de índice de mapa de bits no está exento de gastos generales).


Entonces, "Escaneo del montón de mapa de bits": ¡Una página no se puede visitar más de una vez! pero "Índice puede": una página se puede visitar más de una vez, porque el índice se visita fila por fila en orden.
francos

Probablemente haya un almacenamiento en caché involucrado cuando las páginas se visitan varias veces: la página se cargará desde el disco la primera vez (lento), y el acceso posterior llegará al caché en la memoria (caché de Postgres (rápido) o caché del sistema operativo (más rápido)) .
Matthieu

También está el index-only scancuándo solo se accede a la columna indexada en la consulta. en este caso, index-only scanno es necesario acceder a los datos del montón (página de datos): postgresql.org/docs/12/indexes-index-only-scans.html
Alan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.