PostgreSQL implementeert tupels zeer grondig (in tegenstelling tot halve implementaties in Oracle, DB2, SQL Server, enz.). U kunt uw conditie opschrijven met behulp van "tupels ongelijkheid", zoals in:
select *
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10
Houd er rekening mee dat aangezien de tweede kolom in aflopende volgorde staat, u de waarde ervan moet "omkeren" tijdens de vergelijking. Daarom wordt het uitgedrukt als -b
en ook, -20
. Dit kan lastig zijn voor niet-numerieke kolommen zoals datums, varchars, LOB's, enz.
Ten slotte is het gebruik van een index nog steeds mogelijk met de -b
kolomwaarde als u een ad-hocindex maakt, zoals:
create index ix1 on table1 (a, (-b), c);
U kunt PostgreSQL echter nooit dwingen een index te gebruiken. SQL is een declaratieve taal, geen imperatieve taal. Je kunt verleiden om dit te doen door de tabelstatistieken up-to-date te houden en ook door een klein aantal rijen te selecteren. Als uw LIMIT
te groot is, kan PostgreSQL geneigd zijn om in plaats daarvan een volledige tabelscan te gebruiken.