Was ist ein "Bitmap-Heap-Scan" in einem Abfrageplan?


112

Ich möchte das Prinzip des "Bitmap-Heap-Scans" kennen. Ich weiß, dass dies häufig passiert, wenn ich eine Abfrage mit ORin der Bedingung ausführe .

Wer kann das Prinzip eines "Bitmap-Heap-Scans" erklären?

Antworten:


121

Die beste Erklärung kommt von Tom Lane , dem Autor des Algorithmus, sofern ich mich nicht irre. Siehe auch den Wikipedia-Artikel .

Kurz gesagt, es ist ein bisschen wie ein Seq-Scan. Der Unterschied besteht darin, dass ein Bitmap-Index nicht jede Festplattenseite besucht, sondern die zutreffenden Indizes ANDs und ORs zusammen scannt und nur die erforderlichen Festplattenseiten aufruft.

Dies unterscheidet sich von einem Index-Scan, bei dem der Index zeilenweise nacheinander besucht wird. Dies bedeutet, dass eine Festplattenseite möglicherweise mehrmals besucht wird.


Betreff: die Frage in Ihrem Kommentar ... Ja, genau das ist es.

Ein Index-Scan durchläuft die Zeilen nacheinander und öffnet die Festplattenseiten so oft wie nötig immer wieder (einige bleiben natürlich im Speicher, aber Sie verstehen es).

Ein Bitmap-Index-Scan öffnet nacheinander eine kurze Liste von Festplattenseiten und greift auf jede zutreffende Zeile in jeder zu (daher der sogenannte Recheck-Zustand, den Sie in Abfrageplänen sehen).

Beachten Sie außerdem, wie sich Clustering / Zeilenreihenfolge auf die damit verbundenen Kosten bei beiden Methoden auswirkt. Wenn sich die Zeilen in zufälliger Reihenfolge befinden, ist ein Bitmap-Index günstiger. (Und in der Tat, wenn sie wirklich überall sind , ist ein seq-Scan am billigsten, da ein Bitmap-Index-Scan nicht ohne Overhead ist.)


"Bitmap-Heap-Scan": Eine Seite kann nicht mehr als einmal besucht werden! aber "Index kann": Eine Seite kann mehrmals besucht werden, da der Index der Reihe nach zeilenweise besucht wird.
Franken

Wenn mehrere Seiten mehrmals besucht werden, liegt wahrscheinlich ein Caching vor: Die Seite wird tatsächlich beim ersten Mal (langsam) von der Festplatte geladen, und der weitere Zugriff trifft auf den Cache im Speicher (Postgres-Cache (schnell) oder Betriebssystem-Cache (schneller)). .
Matthieu

Es gibt auch die index-only scanMeldung, dass in der Abfrage nur auf indizierte Spalten zugegriffen wird. In diesem Fall index-only scanmuss nicht auf Heap-Daten (Datenseite) zugegriffen
Alan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.