PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ORDER BY indexé avec LIMIT 1

En supposant que nous ayons affaire à une grande table , un index partiel pourrait aider :

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

Comme vous l'avez déjà découvert :descendre ou monter importe peu ici. Postgres peut analyser en arrière presque à la même vitesse (des exceptions s'appliquent avec les index multi-colonnes).

Requête pour utiliser cet index :

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

Le but ici est de rendre l'index beaucoup plus petit , il devrait donc être plus facile à mettre en cache et à entretenir.

  1. Vous devez choisir un horodatage garanti plus petit que le plus récent.
  2. Vous devez recréer l'index de temps en temps pour supprimer les anciennes données.
  3. La condition doit être IMMUTABLE .

Ainsi, l'effet ponctuel se détériore avec le temps. Le problème spécifique est la condition codée en dur :

WHERE created_at > '2013-09-15 0:0'::timestamp

Automatiser

Vous pouvez mettre à jour l'index et vos requêtes manuellement de temps en temps. Ou vous l'automatisez à l'aide d'une fonction comme celle-ci :

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

Indice :

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

Requête :

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

Automatisez la recréation avec une tâche cron ou un événement basé sur un déclencheur. Vos requêtes peuvent rester les mêmes maintenant. Mais vous devez recréer tous les index utiliser cette fonction de quelque manière que ce soit après l'avoir modifiée. Il suffit de déposer et de créer chacun.

Premier ..

... testez si vous touchez réellement le goulot d'étranglement avec cela.

Essayez si un simple index DROP index ... ; CREATE index ... Fait le travail. Ensuite, votre index pourrait avoir été gonflé. Vos paramètres de vide automatique sont peut-être désactivés.

Ou essayez VACUUM FULL ANALYZE pour obtenir votre table entière plus les index en parfait état et vérifier à nouveau.

Autres options inclure le réglage général habituel des performances et les index de couverture, en fonction de ce que vous récupérez réellement de la table.