Asumiendo que estamos tratando con una mesa grande , un índice parcial podría ayudar:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;
Como ya averiguaste:aquí poco importa descender o ascender. Postgres puede escanear hacia atrás casi a la misma velocidad (se aplican excepciones con índices de varias columnas).
Consulta para utilizar este índice:
SELECT * FROM tbl
WHERE created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER BY created_at DESC
LIMIT 1;
El punto aquí es hacer que el índice sea mucho más pequeño , por lo que debería ser más fácil de almacenar en caché y mantener.
- Debe elegir una marca de tiempo que se garantice que sea más pequeña que la más reciente.
- Debe volver a crear el índice de vez en cuando para eliminar los datos antiguos.
- La condición debe ser
IMMUTABLE
.
Entonces, el efecto de una sola vez se deteriora con el tiempo. El problema específico es la condición codificada:
WHERE created_at > '2013-09-15 0:0'::timestamp
Automatizar
Puede actualizar el índice y sus consultas manualmente de vez en cuando. O lo automatizas con la ayuda de una función como esta:
CREATE OR REPLACE FUNCTION f_min_ts()
RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$
Índice:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();
Consulta:
SELECT * FROM tbl
WHERE created_at > f_min_ts()
ORDER BY created_at DESC
LIMIT 1;
Automatice la recreación con un trabajo cron o algún evento basado en disparadores. Sus consultas pueden permanecer igual ahora. Pero necesita volver a crear todos los índices usar esta función de ninguna manera después de cambiarla. Solo suelta y crea cada uno.
Primero...
... prueba si realmente estás golpeando el cuello de la botella con esto.
Pruebe si un índice DROP index ... ; CREATE index ...
hace el trabajo. Entonces su índice podría haber sido hinchado. Su configuración de vacío automático puede estar desactivada.
O prueba VACUUM FULL ANALYZE
para obtener toda la tabla más los índices en perfectas condiciones y comprobar de nuevo.
Otras opciones incluyen los índices de ajuste y cobertura de rendimiento general habituales, dependiendo de lo que realmente recupere de la tabla.