¿Por qué PostgreSQL realiza un escaneo secuencial en una columna indexada?

Resuelto Alex Vayda asked hace 13 años • 4 respuestas

Un ejemplo muy sencillo: una tabla, un índice, una consulta:

CREATE TABLE book
(
  id bigserial NOT NULL,
  "year" integer,
  -- other columns...
);

CREATE INDEX book_year_idx ON book (year)

EXPLAIN
 SELECT *
   FROM book b
  WHERE b.year > 2009

me da:

Seq Scan on book b  (cost=0.00..25663.80 rows=105425 width=622)
  Filter: (year > 2009)

¿Por qué NO realiza un escaneo de índice? ¿Qué me estoy perdiendo?

Alex Vayda avatar Mar 05 '11 19:03 Alex Vayda
Aceptado

Si SELECT devuelve más de aproximadamente el 5-10% de todas las filas de la tabla, un escaneo secuencial es mucho más rápido que un escaneo de índice.

Esto se debe a que un escaneo de índice requiere varias operaciones de E/S para cada fila (busque la fila en el índice y luego recupere la fila del montón). Mientras que un escaneo secuencial solo requiere una única IO para cada fila, o incluso menos porque un bloque (página) en el disco contiene más de una fila, por lo que se puede recuperar más de una fila con una sola operación de IO.

Por cierto: esto también es cierto para otros DBMS: se descartan algunas optimizaciones como "escaneos de solo índice" (pero para un SELECT * es muy poco probable que un DBMS de este tipo realice un "escaneo de solo índice")

 avatar Mar 05 '2011 12:03

¿ANALIZASTE la tabla/base de datos? ¿Y qué pasa con las estadísticas ? Cuando hay muchos registros cuyo año es > 2009, una exploración secuencial puede ser más rápida que una exploración de índice.

Frank Heikens avatar Mar 05 '2011 12:03 Frank Heikens