Was bedeutet "Heap Block" in "Bitmap Heap Scan"?

8

Ich habe diese Frage:

EXPLAIN (ANALYZE, BUFFERS) 
SELECT * FROM test
WHERE
    timestamp_range @> '2015-01-22 23:00:00'::timestamp
    AND data_int_array @> '{49, 61}'::integer[];

Welche Ausgänge:

Bitmap Heap Scan on test  (cost=16.74..20.75 rows=1 width=113) (actual time=0.364..0.367 rows=2 loops=1)
  Recheck Cond: ((timestamp_range @> '2015-01-22 23:00:00'::timestamp without time zone) AND (data_int_array @> '{49,61}'::integer[]))
  Heap Blocks: exact=1
  Buffers: shared hit=8
  ->  BitmapAnd  (cost=16.74..16.74 rows=1 width=0) (actual time=0.351..0.351 rows=0 loops=1)
        Buffers: shared hit=7
        ->  Bitmap Index Scan on ix_test_interval  (cost=0.00..4.40 rows=17 width=0) (actual time=0.130..0.130 rows=12 loops=1)
              Index Cond: (timestamp_range @> '2015-01-22 23:00:00'::timestamp without time zone)
              Buffers: shared hit=2
        ->  Bitmap Index Scan on ix_test_data_int_array_data_json  (cost=0.00..12.08 rows=11 width=0) (actual time=0.211..0.211 rows=6 loops=1)
              Index Cond: (data_int_array @> '{49,61}'::integer[])
              Buffers: shared hit=5
Planning time: 0.396 ms
Execution time: 0.484 ms

Ich habe die Dokumentation " Using Explain " gelesen , aber keinen Verweis auf Heap Block gefunden.

Könnten Sie mir bitte sagen, was Heap Bockbedeutet und wie es sich Buffersin einem bezieht Bitmap Heap Scan?

Ich renne: " PostgreSQL 9.4.5, compiled by Visual C++ build 1800, 64-bit"

Jesús López
quelle

Antworten:

10

Bitmaps können entweder eine Bitmap von Zeilen speichern, oder wenn diese zu groß wird, um in work_mem zu passen, kann sie durch Speichern einer Bitmap von Blöcken "verlustbehaftet" werden. Dies kann selektiv erfolgen, sodass einige Blöcke verlustbehaftet konvertiert werden können, andere nicht.

Wenn es verlustbehaftet ist, muss der Heap-Scan jede Zeile in jedem verlustbehafteten Block, den er besucht, erneut überprüfen, da er keine Informationen mehr darüber enthält, welche bestimmten Zeilen in diesem Block die Suchkriterien erfüllen.

"Heap-Blöcke: genau = 1" bedeutet, dass nur ein Block besucht wurde und dass er nicht verlustbehaftet war. (Ihre beiden zurückgegebenen Zeilen befanden sich also im selben Block.)

Dies stimmt mit den Pufferdaten überein. Die Bitmap Index Scansund BitmapAndinsgesamt 7 Blöcke getroffen. Der Heap-Scan traf noch einen und brachte ihn auf 8.

jjanes
quelle
Vielen Dank. Wenn ich das richtig verstehe, ist ein Block eine Bitmap, in der Zeilenreferenzen oder Blockreferenzen gespeichert werden. Ich denke, diese Blöcke werden zuerst durch die zwei Bitmap-Index-Scans erstellt. BitmapAnd nimmt diese Blöcke, führt die Operation und aus und gibt einen Block zurück. Habe ich recht?
Jesús López
Ein "Block" (oder eine "Seite") ist ein 8-KB-Block Speicherplatz, auf dem Ihre permanenten Daten gespeichert sind. Bevor Sie etwas mit einem Block machen können, müssen Sie ihn in den RAM ziehen und in einen "Puffer" legen. Die Bitmap selbst ist eine transiente Datenstruktur, die nur im RAM existiert und daher nicht blockstrukturiert ist (oder zumindest nicht im gleichen Sinne wie Heap-Blöcke). Es liest Indexblöcke, um die Daten zu erhalten, die zum Erstellen der Bitmap benötigt werden (in diesem Fall liest es die Blöcke nicht wirklich, weil es sie bereits in den Puffern gefunden hat), und verwendet dann die Bitmap, um zu entscheiden, welche Tabelle ("Heap") Blöcke, die es inspizieren muss.
jjanes