sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa ett unikt index på en icke-unik kolumn

Ett index kan bara indexera faktiska rader, inte aggregerade rader. Så, ja, vad gäller det önskade indexet är det enda alternativet att skapa en tabell med unika värden som du nämnde. Framtvinga referensintegritet med en främmande nyckel-begränsning från data.day till days.day . Detta kan också vara bäst för prestanda, beroende på hela situationen.

Men eftersom det handlar om prestanda , det finns en alternativ lösning:du kan använda en rekursiv CTE för att emulera en lös indexskanning:

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 runt den första SELECT krävs på grund av den bifogade ORDER BY och LIMIT klausuler. Se:

Detta behöver bara ett vanligt index på day .

Det finns olika varianter, beroende på dina faktiska frågor:

Mer i mitt svar på din följdfråga:




  1. Infoga i samma tabell trigger mysql

  2. Hantera rumslig data i CakePHP

  3. Hibernate uuid generation och mysql uuid funktion uuid()

  4. Exportera lagrat procedurresultat till Excel i SSMS