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.