sql >> Database >  >> RDS >> PostgreSQL

Indexscan voor vergelijking van meerdere kolommen - niet-uniforme volgorde van indexkolommen

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.



  1. Maakt de index op Varchar prestatieverschil?

  2. ORACLE Selecteer Distinct retourneer veel kolommen en waar

  3. Een index maken op een tijdstempel om de query te optimaliseren

  4. Hoe @@MAX_CONNECTIONS werkt in SQL Server