PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Indexscan für mehrspaltigen Vergleich – uneinheitliche Reihenfolge der Indexspalten

PostgreSQL implementiert Tupel sehr gründlich (im Gegensatz zu halben Implementierungen, die in Oracle, DB2, SQL Server usw. zu finden sind). Sie können Ihre Bedingung mit "Tupel-Ungleichheit" schreiben, wie in:

select * 
from table1
where (a, -b, c) >= (10, -20, 30)
order by a, -b, c
limit 10

Bitte beachten Sie, dass Sie, da die zweite Spalte absteigend sortiert ist, ihren Wert während des Vergleichs "invertieren" müssen. Deshalb wird es als -b ausgedrückt und auch -20 . Dies kann bei nicht numerischen Spalten wie Datumsangaben, Varchars, LOBs usw. schwierig sein.

Schließlich ist die Verwendung eines Index noch mit dem -b möglich Spaltenwert, wenn Sie einen Ad-hoc-Index erstellen, z. B.:

create index ix1 on table1 (a, (-b), c);

Sie können PostgreSQL jedoch niemals zwingen, einen Index zu verwenden. SQL ist eine deklarative Sprache, keine imperative. Sie können locken Dies geschieht, indem die Tabellenstatistiken auf dem neuesten Stand gehalten und auch eine kleine Anzahl von Zeilen ausgewählt werden. Wenn Ihr LIMIT zu groß ist, könnte PostgreSQL dazu neigen, stattdessen einen vollständigen Tabellenscan zu verwenden.