Respuesta

65

http://www.postgresql.org/docs/8.2/static/using-explain.html

Básicamente, un recorrido secuencial va a las filas reales, y comenzar a leer desde la fila 1, y continuará hasta que se satisfizo la consulta (esto puede no ser toda la tabla, ej., en el caso del límite)

El escaneo del mapa de bits significa que PostgreSQL ha encontrado un pequeño subconjunto de filas para buscar (por ejemplo, de un índice), y va a buscar solo esas filas. Esto, por supuesto, tendrá mucha más búsqueda, por lo que es más rápido solo cuando necesita un pequeño subconjunto de filas.

Tomemos un ejemplo:

create table test (a int primary key, b int unique, c int); 
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5); 

Ahora, podemos obtener fácilmente una exploración siguientes:

explain select * from test where a != 4 

         QUERY PLAN       
--------------------------------------------------------- 
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12) 
    Filter: (a <> 4) 

Se hizo un recorrido secuencial, ya que estima que va a agarrar la gran mayoría de la mesa ; tratar de hacer eso (en lugar de una gran lectura sin buscar) sería una tontería.

Ahora, podemos utilizar el índice:

explain select * from test where a = 4 ; 
           QUERY PLAN        
---------------------------------------------------------------------- 
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4) 
    Index Cond: (a = 4) 

Y, por último, podemos obtener algunas operaciones de mapa de bits:

explain select * from test where a = 4 or a = 3; 
            QUERY PLAN         
------------------------------------------------------------------------------ 
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12) 
    Recheck Cond: ((a = 4) OR (a = 3)) 
    -> BitmapOr (cost=8.52..8.52 rows=2 width=0) 
     -> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0) 
       Index Cond: (a = 4) 
     -> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0) 
       Index Cond: (a = 3) 

Podemos leer esto como:

  1. Construir una mapa de bits de las filas que queremos para a = 4. (Exploración de índice de mapa de bits)
  2. Cree un mapa de bits de las filas que queremos para a = 3. (Exploración de mapa de bits de índice)
  3. O los dos mapas de bits juntos (BitmapOr)
  4. Mira esas filas en la tabla (mapa de bits Montón Scan) y comprobar para asegurarse de que a = 4 ó a = 3 (cond? Servicios)

[Sí, estos planes de consulta son estúpidos, pero eso es porque no analizó test Tenía analizamos esto, todos estarían exploraciones secuenciales, ya que hay 5 pequeñas filas]

+1

O un escaneo de mapa de bits también puede ser un subconjunto de escaneos de índice. – WolfmanDragon

+0

@derobert, ¿qué quieres decir con "buscar"? No se puede encontrar ninguna mención de ello en ninguna parte ... – zapadlo

+1

@Zapadlo Buscando como en una búsqueda de disco, por ejemplo, acceso aleatorio en lugar de secuencial. – derobert

Cuestiones relacionadas