PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Crea un indice univoco su una colonna non univoca

Un indice può indicizzare solo righe effettive, non righe aggregate. Quindi, sì, per quanto riguarda l'indice desiderato, la creazione di una tabella con valori univoci come hai menzionato è la tua unica opzione. Applica l'integrità referenziale con un vincolo di chiave esterna da data.day a days.day . Questo potrebbe essere anche il migliore per le prestazioni, a seconda della situazione completa.

Tuttavia, poiché si tratta di rendimento , esiste una soluzione alternativa:puoi utilizzare un CTE ricorsivo per emulare una scansione dell'indice allentata:

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;

Parentesi intorno al primo SELECT sono obbligatori a causa del ORDER BY allegato e LIMIT clausole. Vedi:

Questo richiede solo un semplice indice il day .

Esistono varie varianti, a seconda delle tue effettive query:

Altro nella mia risposta alla tua domanda di follow-up: