Ejemplo muy simple: 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 exploración de índice en su lugar? ¿Qué me estoy perdiendo?
fuente
¿ ANALIZASTE la tabla / base de datos? ¿Y qué hay de las estadísticas ? Cuando hay muchos registros en el año> 2009, una exploración secuencial puede ser más rápida que una exploración de índice.
fuente
En el escaneo de índice, lea los saltos de cabeza de una fila a otra, que es 1000 veces más lento que leer el siguiente bloque físico (en el escaneo secuencial).
Por lo tanto, si el (número de registros a recuperar * 1000) es menor que el número total de registros, la exploración del índice funcionará mejor.
fuente
@a_horse_with_no_name lo explicó bastante bien. Además, si realmente desea usar un escaneo de índice, generalmente debe usar rangos acotados en la cláusula where. por ejemplo, año> 2019 y año <2020.
Muchas veces las estadísticas no se actualizan en una tabla y es posible que no sea posible debido a restricciones. En este caso, el optimizador no sabrá cuántas filas debe tomar en el año> 2019. Por lo tanto, selecciona una exploración secuencial en lugar de un conocimiento completo. Las particiones limitadas resolverán el problema la mayor parte del tiempo.
fuente