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

Créer un index unique sur une colonne non unique

Un index ne peut indexer que des lignes réelles, pas des lignes agrégées. Donc, oui, en ce qui concerne l'index souhaité, la création d'une table avec des valeurs uniques comme vous l'avez mentionné est votre seule option. Appliquer l'intégrité référentielle avec une contrainte de clé étrangère de data.day à days.day . Cela pourrait également être le meilleur pour les performances, en fonction de la situation complète.

Cependant, puisqu'il s'agit de performances , il existe une solution alternative :vous pouvez utiliser un CTE récursif pour émuler un balayage d'index lâche :

WITH RECURSIVE cte AS (
   (  -- parentheses required
   SELECT day FROM data ORDER BY 1 LIMIT 1
   )
   UNION ALL
   SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
   FROM   cte  c
   WHERE  c.day IS NOT NULL  -- exit condition
   )
SELECT day FROM cte;

Parenthèses autour du premier SELECT sont requis en raison du ORDER BY ci-joint et LIMIT clauses. Voir :

Cela ne nécessite qu'un index simple le day .

Il existe différentes variantes, en fonction de vos requêtes réelles :

Plus dans ma réponse à votre question de suivi :