Ich werde versuchen, meine Missverständnisse anhand des folgenden Beispiels zu erklären.
Ich habe die Grundlagen des nicht verstanden Bitmap Heap Scan Node
. Betrachten Sie die Abfrage, SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
deren Plan wie folgt lautet:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
Mein Verständnis dieses Knotens :
Wie erklärt es , die bitmap heap scan
liest Tabellenblöcke in der angegebenen Reihenfolge, so dass es nicht zufällig-table-Zugang Overhead , die genauso tun geschieht produziert Index Scan
.
Nachdem Index Scan
dies geschehen ist, kann PostgreSQL die Zeilen nicht optimal abrufen, um unnötige Zugriffe zu vermeiden heap blocks reads
(oder hits
wenn ein Hot-Cache vorhanden ist). Um es herauszufinden, generiert es die Bitmap Index Scan
aufgerufene Struktur ( ), bitmap
die in meinem Fall durch Generieren von zwei Bitmaps der Indizes und Ausführen generiert wird BITWISE AND
. Da die Bitmap generiert wurde, kann sie jetzt die Tabelle in einer sequentiellen Reihenfolge optimal lesen, ohne dass dies unnötig ist heap I/O-operations
.
Das ist der Ort, an dem viele Fragen auftauchen.
FRAGE: Wir haben nur eine Bitmap. Woher weiß PostgreSQL anhand einer Bitmap etwas über die physische Reihenfolge der Zeilen? Oder wird die Bitmap so generiert, dass jedes Element auf einfache Weise dem Zeiger auf eine Seite zugeordnet werden kann? Wenn ja, erklärt das alles, aber es ist nur meine Vermutung.
Können wir also einfach sagen, dass das bitmap heap scan -> bitmap index scan
wie ein sequentieller Scan ist, aber nur der entsprechende Teil der Tabelle?
001001010101011010101
. Oder spielt es eigentlich keine Rolle und wir müssen nur wissen, dass es einen Block recht schnell anhand seiner Bitmap finden kann ...?