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

Opret et unikt indeks på en ikke-unik kolonne

Et indeks kan kun indeksere faktiske rækker, ikke aggregerede rækker. Så ja, hvad angår det ønskede indeks, er det din eneste mulighed at oprette en tabel med unikke værdier, som du nævnte. Håndhæv referenceintegritet med en fremmednøglebegrænsning fra data.day til days.day . Dette måske også være bedst til ydeevne, afhængigt af den komplette situation.

Men da dette handler om ydelse , er der en alternativ løsning:du kan bruge en rekursiv CTE til at efterligne en løs indeksscanning:

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;

Parentes omkring den første SELECT er påkrævet på grund af den vedhæftede ORDER BY og LIMIT klausuler. Se:

Dette kræver kun et almindeligt indeks på day .

Der er forskellige varianter, afhængigt af dine faktiske forespørgsler:

Mere i mit svar på dit opfølgende spørgsmål:




  1. Hvordan sender man datatabel som input til procedure i C#?

  2. SQL INSERT uden at angive kolonner. Hvad der sker?

  3. Henter antallet af rækker med en bestemt værdi efter filtrering af forespørgsel gennem datovælger

  4. plpgsql CREATE FUNCTION syntaksfejl ved eller nær 'CREATE'