sql >> Base de Datos >  >> RDS >> PostgreSQL

ORDEN indexado por con LÍMITE 1

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.

  1. Debe elegir una marca de tiempo que se garantice que sea más pequeña que la más reciente.
  2. Debe volver a crear el índice de vez en cuando para eliminar los datos antiguos.
  3. 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.