Ich habe gelesen, dass PostgreSQL im Allgemeinen mehrere Indizes verwenden kann, aber im speziellen Fall einer Abfrage, die sich über zwei Indizes erstreckt, werden beide verwendet? Wenn ja, werden sie nacheinander oder zusammen geladen?
Wenn sich diese Abfrage beispielsweise über zwei Teilindizes erstreckt column_1
, wie werden Teilindizes verwendet, wenn überhaupt, und wie werden die Indexdaten geladen und verworfen:
SELECT 1 FROM sample_table WHERE column_1 > 50 AND column_2 < 50000
explain analyze
auf Ihrer Abfrage mit Ihren Daten. Ich habe die Erfahrung gemacht, dass Postgres zwei Indizes nur dann bevorzugt, wennor
Bedingungen betroffen sind. Ich habe dies beiand
Bedingungen kaum jemals gesehen .and
Bedingungen verwendet wurden?and
Bedingung verwendet wurden (zumindest kann ich mich nicht daran erinnern)Antworten:
Sehr kurze Version: Ja, manchmal.
PostgreSQL kann Bitmap-Index-Scans verwenden, um mehrere Indizes zu kombinieren.
Ein Prädikat wie
ist eine Spezialisierung der allgemeineren Form:
für a = b.
PostgreSQL kann hier zwei Indizes verwenden, einen für jeden Teil des Prädikats, und diese dann einer Bitmap
AND
zuordnen. Es spielt keine Rolle, ob sie sich in verschiedenen Bereichen derselben Spalte befinden.Dies ist viel weniger effizient als ein einzelner Index und für einige Abfragen möglicherweise nicht hilfreich, aber möglich.
Das größere Problem ist, dass die teilweise Indexunterstützung von PostgreSQL nicht sehr gut ist. Unabhängig davon, ob es einen oder zwei Indizes gibt, kann es sein, dass der Index überhaupt nicht verwendet werden kann.
Demonstrationsaufbau:
OK, was wird Pg für gegebene Anfragen bevorzugen?
Was ist, wenn wir versuchen, einen Bitmap-Index-Scan zu erzwingen, um herauszufinden, ob Pg einen verwenden kann , auch wenn es sich für diesen speziellen einfachen Fall und eine kleine Stichprobe nicht lohnt, dies zu tun?
Versuchen:
Hm. Nee. Die Indizes dort nicht kombinieren. Es könnte aber einfach nicht glauben, dass es sich lohnt, einen zweiten Index zu scannen.
Was ist mit einer Abfrage, die stattdessen zwei Prädikate ODER-verknüpft?
Hier hat PostgreSQL beide Indizes ODER-verknüpft, um eine Übereinstimmung zu finden, dann einen Heap-Scan durchgeführt und erneut überprüft.
Ja, PostgreSQL kann zumindest für einige Abfragen mehrere Teilindizes kombinieren, sofern dies sinnvoll ist.
Aber wenn ich
RESET
den Planer überschreibe ...... Pg wird erkennen, dass es schneller ist, die Tabelle nur nacheinander zu scannen.
quelle
x < 5000
sollte seinx < 50000
. Wenn dies korrigiert ist, nehmen sowohl die zweite als auch die dritte Abfrage die Teilindizes auf. Beispiel: `` `Index-Scan mit xs_below_50000 auf Teil (Kosten = 0,29..1659,47 Zeilen = 50219 Breite = 4) Indexbedingung: (x> 20)