私はこのクエリを持っています:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM test
WHERE
timestamp_range @> '2015-01-22 23:00:00'::timestamp
AND data_int_array @> '{49, 61}'::integer[];
どの出力:
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
ドキュメント「 sing Explain 」を読みましたが、ヒープブロックへの参照が見つかりませんでした。
Heap Bock
の意味と、Bitmap Heap Scan
のBuffers
との関係を教えてください。
実行中:「PostgreSQL 9.4.5, compiled by Visual C++ build 1800, 64-bit
」
ビットマップは、行のビットマップを格納できます。または、それが大きくなりすぎてwork_memに収まらない場合は、ブロックのビットマップを格納することによって「損失」する可能性があります。これは選択的に実行できるため、一部のブロックは非可逆に変換でき、他のブロックは不可逆に変換できます。
損失が発生した場合、ヒープスキャンは、アクセスしたすべての損失のあるブロックのすべての行を再チェックする必要があります。これは、ブロック内の特定の行が検索条件を満たしたという情報がないためです。
「ヒープブロック:exact = 1」は、1つのブロックのみを訪問したこと、および損失がなかったことを意味します。 (したがって、返されたあなたの両方の行は同じブロックにありました)
これはバッファデータと一致します。 Bitmap Index Scans
とBitmapAnd
の合計が7ブロックにヒットしました。ヒープスキャンがさらに1つヒットし、最大8になりました。