Pregunta

Tengo una Tabla T con una columna C, que es un INT y tiene un índice BTree.

¿Por qué la siguiente consulta no utiliza este índice?

explain select c from t group by c;

El resultado que obtengo es:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)

Mi comprensión de los índices es limitada, pero pensé que tales consultas eran el propósito de los índices.

¿Fue útil?

Solución

La consulta ciertamente puede usar un índice. La razón por la que no es en su caso particular depende del tamaño y la distribución particular de los datos. Puedes usar SET enable_seqscan TO off investigar.

Otros consejos

Esta consulta se puede realizar utilizando una optimización llamada escaneo de índice suelto. Sin embargo, PostgreSQL aún no implementa esta optimización, por lo que utiliza un escaneo de tabla.

De las principales bases de datos, que yo sepa solo Mysql ha implementado escaneo de índice suelto (¿Quizás Oracle también?). Postgresql no implementó esta función.

Debido a que requiere escanear toda la tabla, hacerlo a través del índice no tiene ningún beneficio. ("Cubrir índices" no es útil como técnica de rendimiento en PostgreSQL debido a su implementación de MVCC).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top