PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Criar um índice exclusivo em uma coluna não exclusiva


Um índice só pode indexar linhas reais, não linhas agregadas. Então, sim, no que diz respeito ao índice desejado, criar uma tabela com valores únicos como você mencionou é sua única opção. Imponha a integridade referencial com uma restrição de chave estrangeira de data.day para days.day . Isso pode também ser o melhor para o desempenho, dependendo da situação completa.

No entanto, como se trata de desempenho , existe uma solução alternativa:você pode usar um CTE recursivo para emular uma varredura de índice solto:
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ênteses ao redor do primeiro SELECT são necessários devido ao ORDER BY anexado e LIMIT cláusulas. Ver:

Isso só precisa de um índice simples no day .

Existem várias variantes, dependendo de suas consultas reais:

Mais na minha resposta à sua pergunta de acompanhamento: