PostgreSQL DBA(6) - SeqScan frente a IndexScan frente a BitmapHeapScan
Esta sección presenta los tres tipos de escaneos de tablas de datos en PostgreSQL: SeqScan se usa para escaneos secuenciales, IndexScan se usa para escaneos de índice y BitmapHeapScan se usa para escaneos de montón de mapas de bits.
Tasa de selección = Número de primitivas después del filtrado condicional/Número de primitivas antes del filtrado condicional
ScanSeqScan secuencial
Realizado directamente en los datos del montón de la tabla de datos Secuencial El escaneo es adecuado para escenarios con una alta tasa de selección.
IndexScan
Acceda al índice para obtener el puntero a la ubicación de la tupla y luego acceda a los datos del montón, adecuado para escenarios de aplicación con baja tasa de selección.
BitmapHeapScan
BitmapHeapScan almacena el ID de página (bloque) de la tupla calificada en el mapa de bits a través de BitmapIndexScan y luego accede a los datos del montón a través del mapa de bits. Un escaneo de índice de mapa de bits guarda el ID de página (bloque) de la tupla calificada en un mapa de bits y luego accede a los datos del montón a través del mapa de bits.
2018.10.01 Fijo, el escaneo de índice es adecuado para baja selectividad, el escaneo secuencial es adecuado para alta selectividad
Vale la pena señalar:
1. "Alto "Selectividad" es una expresión cualitativa y, de hecho, PG determina qué método de escaneo utilizar en función de los cálculos de costos. Normalmente, los escaneos de índice se realizan principalmente a través de dispositivos de almacenamiento de acceso aleatorio. En la configuración de parámetros de inicialización de PG, el costo del acceso aleatorio es 4, mientras que el costo del acceso secuencial es 1. Esta es una estimación muy aproximada de los bloques de índice. Los bloques de montón a los que se accede por índice son 1/4 más que los bloques de montón a los que se accede secuencialmente, entonces PG elegirá utilizar el escaneo secuencial en lugar del escaneo de índice.
2. El método de escaneo IndexScan es acceder al índice. Si se cumplen las condiciones, se accede inmediatamente a los datos del montón de acuerdo con el puntero de posición de la tupla en el índice para obtener la tupla, mientras que el escaneo del índice de mapa de bits (BitmapIndexScan ) es acceder La condición del índice es que el ID del bloque esté almacenado en el mapa de bits. Finalmente, la operación de obtener la tupla a través del escaneo del índice del mapa de bits (BitmapIndexScan) es acceder al índice almacenado en el mapa de bits y no implica escaneo. de los datos del montón. La obtención de tuplas se realiza mediante un escaneo BitmapHeapScan.
Las diferencias entre los dos métodos se resumen a continuación:
Aquí hay un script de muestra que demuestra visualmente las diferencias entre los dos métodos.
Pruebe la tabla de datos, t_dwxx, 10000 filas de datos, cree PK en dwbh
Script de prueba:
La condición de consulta es dwbh gt '1000'; La tarifa es baja, PG eligió el escaneo secuencial SeqScan, el costo es 189.00, cómo calcular el costo, las personas interesadas pueden consultar la explicación del código fuente (53), a través de gdb, y calcular el costo de los datos. 53), análisis de trazas a través de gdb.
Script de prueba:
La condición de consulta es dwbh = '10000', la tasa de selección es muy alta, solo hay 1 registro y se selecciona el escaneo de índice.
Costo total 8,30 = costo inicial: un acceso a bloque de índice y un acceso a bloque de montón = 0,29 4 4 ≈ 8,30
Script de prueba:
La condición de consulta es dwbh gt; '1000' y dwbh lt; '3000', la tasa de selección no es ni demasiado alta ni demasiado baja, PG selecciona BitmapHeapScan. El costo inicial de BitmapHeapScan es 51,07 y el costo total es 148,42. La forma en que se calcula el costo se rastreará y analizará en la siguiente explicación del código fuente.
Vale la pena señalar que hay otro paso después de BitmapIndexScan: volver a verificar. Esto se debe a que el escaneo del índice de mapa de bits solo busca la ID del bloque del montón, no las tuplas que cumplen con las condiciones, por lo que existe. Un paso de volver a verificar.
Índice de PostgreSQL: escaneo de índice versus escaneo de mapa de bits versus escaneo secuencial
Índice de mapa de bits
¿Qué es el "Escaneo de montón de mapas de bits"?
Índice de mapa de bits
¿Qué es un "escaneo de montón de mapas de bits" en un plan de consulta?