tutorial query plan online ejecucion analyze optimization postgresql query-optimization sql-execution-plan

optimization - query - plan de ejecucion postgresql



¿Cuál es la diferencia entre Seq Scan y Bitmap Heap Scan en postgres? (1)

En la salida del comando de explicación, encontré dos términos ''Seq Scan'' y ''Bitmap heap Scan''. ¿Alguien puede decirme cuál es la diferencia entre estos dos tipos de escaneo? (Estoy usando PostgreSql)


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

Básicamente, un escaneo secuencial va a las filas reales, y comienza a leer desde la fila 1, y continúa hasta que se cumpla la consulta (esta puede no ser la tabla completa, por ejemplo, en el caso del límite)

La exploración de montón de 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.

Tome 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 un escaneo seq:

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)

Hizo un escaneo secuencial porque estima que va a captar la gran mayoría de la tabla; tratar de hacer eso (en lugar de una gran lectura sin buscar) sería una tontería.

Ahora, podemos usar 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 finalmente, 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. Construya un mapa de bits de las filas que queremos para a = 4. (Análisis de índice de mapa de bits)
  2. Construya un mapa de bits de las filas que queremos para a = 3. (Análisis de índice de mapa de bits)
  3. O los dos mapas de bits juntos (BitmapOr)
  4. Mire esas filas en la tabla (Bitmap Heap Scan) y verifique que a = 4 o a = 3 (recheck cond)

[Sí, estos planes de consulta son estúpidos, pero eso se debe a que no hemos podido analizar la test Si lo hubiéramos analizado, todos serían escaneos secuenciales, ya que hay 5 filas diminutas]