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

Varredura de índice para comparação de várias colunas - ordenação de coluna de índice não uniforme


O PostgreSQL implementa tuplas de forma muito completa (diferentemente das implementações de meias encontradas em Oracle, DB2, SQL Server, etc.). Você pode escrever sua condição usando "desigualdade de tuplas", como em:
select * 
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10

Observe que, como a segunda coluna está em ordem decrescente, você deve "inverter" seu valor durante a comparação. É por isso que é expresso como -b e também, -20 . Isso pode ser complicado para colunas não numéricas, como datas, varchars, LOBs, etc.

Finalmente, o uso de um índice ainda é possível com o -b valor da coluna se você criar um índice ad hoc, como:
create index ix1 on table1 (a, (-b), c);

No entanto, você nunca pode forçar o PostgreSQL a usar um índice. SQL é uma linguagem declarativa, não imperativa. Você pode atrair faça isso mantendo as estatísticas da tabela atualizadas e também selecionando um pequeno número de linhas. Se o seu LIMIT for muito grande, o PostgreSQL pode estar inclinado a usar uma varredura completa da tabela.