Parámetros de costos del planificador
Esto me dice que su random_page_cost
y seq_page_cost
probablemente estén equivocados. Es probable que tenga un almacenamiento con E/S aleatorias rápidas, ya sea porque la mayor parte de la base de datos está almacenada en memoria RAM o porque está usando SSD, SAN con caché u otro almacenamiento donde la E/S aleatoria es inherentemente rápida.
Prueba:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
para reducir en gran medida las diferencias de parámetros de costo y luego volver a ejecutar. Si eso funciona, considere cambiar esos parámetros en postgresql.conf.
.
Sus estimaciones de conteo de filas son razonables, por lo que no parece un problema de estimación errónea del planificador o un problema con estadísticas de tabla incorrectas.
Consulta incorrecta
Tu consulta también es incorrecta. OFFSET 0 LIMIT 1
sin ORDER BY
producirá resultados impredecibles a menos que tenga la garantía de tener exactamente una coincidencia, en cuyo caso el OFFSET ... LIMIT ...
las cláusulas son innecesarias y se pueden eliminar por completo.
Por lo general, es mucho mejor formular consultas como SELECT max(...)
o SELECT min(...)
donde sea posible; PostgreSQL tenderá a ser capaz de usar un índice para extraer el valor deseado sin hacer un costoso escaneo de tabla o un escaneo y clasificación de índice.
Consejos
Por cierto, para futuras preguntas, la wiki de PostgreSQL tiene buena información en la categoría de rendimiento y una guía para hacer Preguntas de consulta lenta .