PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erstellen Sie einen eindeutigen Index für eine nicht eindeutige Spalte

Ein Index kann nur tatsächliche Zeilen indizieren, keine aggregierten Zeilen. Ja, was den gewünschten Index betrifft, ist das Erstellen einer Tabelle mit eindeutigen Werten, wie Sie sie erwähnt haben, Ihre einzige Option. Erzwingen Sie die referenzielle Integrität mit einer Fremdschlüsseleinschränkung von data.day bis days.day . Das vielleicht auch am besten für die Leistung sein, je nach Gesamtsituation.

Da es hier aber um Leistung geht , gibt es eine alternative Lösung:Sie können einen rekursiven CTE verwenden, um einen losen Index-Scan zu emulieren:

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;

Klammern um das erste SELECT sind wegen des angehängten ORDER BY erforderlich und LIMIT Klauseln. Siehe:

Dies benötigt nur einen einfachen Index am day .

Abhängig von Ihren konkreten Anfragen gibt es verschiedene Varianten:

Mehr dazu in meiner Antwort auf Ihre Folgefrage: