PostgreSQL implementa le tuple in modo molto completo (a differenza delle mezze implementazioni trovate in Oracle, DB2, SQL Server, ecc.). Puoi scrivere la tua condizione usando "tuple inequality", come in:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Si noti che poiché la seconda colonna è in ordine decrescente, è necessario "invertirne" il valore durante il confronto. Ecco perché è espresso come -b e anche -20 . Questo può essere complicato per colonne non numeriche come date, varchars, LOB, ecc.
Infine, l'uso di un indice è ancora possibile con il -b valore della colonna se crei un indice ad hoc, ad esempio:
create index ix1 on table1 (a, (-b), c);
Tuttavia, non puoi mai forzare PostgreSQL a utilizzare un indice. SQL è un linguaggio dichiarativo, non imperativo. Puoi attirare per farlo mantenendo aggiornate le statistiche della tabella e selezionando un numero ridotto di righe. Se il tuo LIMIT è troppo grande, PostgreSQL potrebbe essere propenso a utilizzare invece una scansione completa della tabella.