PostgreSQL implementerar tupler mycket noggrant (till skillnad från halva implementeringar som finns i Oracle, DB2, SQL Server, etc.). Du kan skriva ditt tillstånd med "tuples inequality", som i:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Observera att eftersom den andra kolumnen är i fallande ordning måste du "invertera" dess värde under jämförelsen. Det är därför det uttrycks som -b
och även -20
. Detta kan vara knepigt för icke-numeriska kolumner som datum, varchar, LOB, etc.
Slutligen är det fortfarande möjligt att använda ett index med -b
kolumnvärde om du skapar ett ad-hoc-index, till exempel:
create index ix1 on table1 (a, (-b), c);
Du kan dock aldrig tvinga PostgreSQL att använda ett index. SQL är ett deklarativt språk, inte ett imperativt. Du kan locka det för att göra det genom att hålla tabellstatistiken uppdaterad, och även genom att välja ett litet antal rader. Om din LIMIT
är för stor kan PostgreSQL vara benägen att använda en fullständig tabellsökning istället.