sql >> Base de Datos >  >> RDS >> PostgreSQL

Crear un índice único en una columna no única

Un índice solo puede indexar filas reales, no filas agregadas. Entonces, sí, en lo que respecta al índice deseado, crear una tabla con valores únicos como los que mencionaste es tu única opción. Hacer cumplir la integridad referencial con una restricción de clave externa de data.day a days.day . Esto podría también ser mejor para el rendimiento, dependiendo de la situación completa.

Sin embargo, dado que se trata de rendimiento , hay una solución alternativa:puede usar un CTE recursivo para emular un escaneo de índice suelto:

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;

Paréntesis alrededor del primer SELECT son obligatorios debido al ORDER BY adjunto y LIMIT cláusulas. Ver:

Esto solo necesita un índice simple en day .

Hay varias variantes, dependiendo de sus consultas reales:

Más en mi respuesta a su pregunta de seguimiento: