sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cuál es la diferencia entre Seq Scan y Bitmap heap scan en postgres?

http://www.postgresql.org/docs/8.2/static /usando-explicar.html

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

El análisis del montón de mapas de bits significa que PostgreSQL ha encontrado un pequeño subconjunto de filas para obtener (por ejemplo, de un índice) y solo obtendrá 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 las 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 secuencial:

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 ocupará la gran mayoría de la mesa; tratar de hacer eso (en lugar de una gran lectura sin búsqueda) 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. Cree un 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 í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 para asegurarse de que a=4 o a=3 (vuelva a verificar cond)

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