2012-09-04 6 views
5

Estoy probando diferentes consultas y tengo curiosidad sobre cómo decide db usar Bitmap Heap Scan y Index Scan.¿Cómo se decide la exploración de mapa de bits y el análisis de índice?

crear índice customers_email_idx en clientes (correo electrónico varchar_pattern_ops);

Como puede ver, hay una tabla de clientes (ejemplo dellstore) y añado un índice a la columna de correo electrónico.

primera consulta está aquí:

seleccionar * de los clientes donde el correo electrónico como 'ITQ%@dell.com'; -> consulta con Index Scan

Explicar analizar consulta está aquí:

              QUERY PLAN                
--------------------------------------------------------------------------------------------------------------------------------- 
Index Scan using customers_email_idx on customers (cost=0.00..8.27 rows=2 width=268) (actual time=0.046..0.046 rows=0 loops=1) 
    Index Cond: (((email)::text ~>=~ 'ITQ'::text) AND ((email)::text ~<~ 'ITR'::text)) 
    Filter: ((email)::text ~~ 'ITQ%@dell.com 
'::text) 
Total runtime: 0.113 ms 

Otros consulta está aquí:

seleccionar * de los clientes donde el correo electrónico como 'TI% @ dell.com '; -> consulta con mapa de bits Montón Scan

Explicar analizar consulta está aquí:

              QUERY PLAN               
------------------------------------------------------------------------------------------------------------------------------ 
Bitmap Heap Scan on customers (cost=4.54..106.77 rows=2 width=268) (actual time=0.206..0.206 rows=0 loops=1) 
    Filter: ((email)::text ~~ 'IT%@dell.com 
'::text) 
    -> Bitmap Index Scan on customers_email_idx (cost=0.00..4.54 rows=29 width=0) (actual time=0.084..0.084 rows=28 loops=1) 
     Index Cond: (((email)::text ~>=~ 'IT'::text) AND ((email)::text ~<~ 'IU'::text)) 
Total runtime: 0.273 ms 

¿Puede explicar por qué este ejemplo se utiliza mapa de bits y el índice de escaneo aquí?

Gracias ..

+1

Ver @ de araqnid y esto: http : //wiki.postgresql.org/images/4/45/Explaining_EXPLAIN.pdf Busque 'index scan'. La clave puede ser 'optimizador puede elegirla [exploración de mapa de bits] para cualquier exploración indexable con baja selectivity' – dezso

+1

Creo que esta pregunta podría encajar en apenas muy bien en dba.SE. –

Respuesta

6

¿Cuántas filas tienes en total en la mesa? La decisión se basa en la proporción de filas que generará el análisis de índice.

Si una parte suficientemente elevada de la mesa va a ser visitada, un recorrido de índice de mapa de bits se utiliza para asegurar que la mayor cantidad de acceso al disco como sea posible es secuencial. Por el contrario, una exploración de índice simple hace acceso aleatorio de una página por vez a los datos de la tabla. (Y si la proporción de la tabla proyectada para acceder es suficientemente alta, el índice no se utiliza en absoluto, y toda la tabla se carga secuencialmente)

Una cuestión es que la proyección de cuántas filas de la tabla se va a acceder es solo una estimación. Pero como se puede imaginar, '% TI' es probable que coincida más de 'ITQ%' (recordemos que el sufijo no es parte del recorrido de índice, sólo el filtro final) respuesta

+0

filas en total: 20.000 - filas encontradas por exploración de índice: 5 - filas encontradas por mapa de bits: 6 – TraviJuu

Cuestiones relacionadas