Có nghĩa là khối Heap Block chặn trong nhóm Bitmap Heap Scan có nghĩa là gì?


8

Tôi có truy vấn này:

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

Đầu ra nào:

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

Tôi đã đọc tài liệu " Sử dụng giải thích ", nhưng tôi không tìm thấy bất kỳ tài liệu tham khảo nào về Heap Block.

Xin vui lòng, bạn có thể cho tôi biết những gì Heap Bockcó nghĩa là gì và nó liên quan đến như thế nào Bufferstrong một Bitmap Heap Scan?

Tôi đang chạy: " PostgreSQL 9.4.5, compiled by Visual C++ build 1800, 64-bit"

Câu trả lời:


10

Bitmap có thể lưu trữ một bitmap của các hàng hoặc nếu nó trở nên quá lớn để phù hợp với work_mem, nó có thể "mất dữ liệu" bằng cách lưu trữ một bitmap của các khối. Nó có thể làm điều này một cách chọn lọc, vì vậy một số khối có thể được chuyển đổi mất trong khi những khối khác thì không.

Nếu nó bị mất, thì Heap Scan phải kiểm tra lại mọi hàng trong mỗi khối mất mà nó truy cập, bởi vì nó không còn thông tin về các hàng cụ thể trong khối đó đáp ứng tiêu chí tìm kiếm.

"Khối Heap: chính xác = 1" có nghĩa là nó chỉ truy cập vào một khối và nó không bị mất. (Vì vậy, cả hai hàng của bạn được trả lại nằm trong cùng một khối)

Điều này đồng ý với dữ liệu của Bộ đệm. Các Bitmap Index ScansBitmapAndtrong tổng số trúng 7 khối. Quét Heap nhấn thêm một lần nữa, nâng lên 8 điểm.


Cảm ơn bạn. Vì vậy, nếu tôi hiểu chính xác một khối là một bitmap lưu trữ các tham chiếu hàng hoặc tham chiếu khối. Tôi đoán các khối này được xây dựng đầu tiên bằng hai lần quét chỉ mục bitmap. BitmapAnd nhận các khối này, thực hiện và vận hành và trả về một Khối. Tôi có đúng không
Jesús López

"Khối" (hoặc "trang") là một khối không gian đĩa 8kB nơi lưu trữ dữ liệu cố định của bạn. Trước khi bạn có thể làm bất cứ điều gì với một khối, bạn phải kéo nó vào RAM và đặt vào một "bộ đệm". Bản thân bitmap là một cấu trúc dữ liệu nhất thời chỉ tồn tại trong RAM và do đó không có cấu trúc khối (hoặc ít nhất, không có nghĩa giống như các khối heap). Nó đọc các khối chỉ mục để lấy dữ liệu cần thiết để tạo bitmap (trong trường hợp này nó không thực sự đọc các khối, vì nó đã tìm thấy chúng trong bộ đệm), sau đó sử dụng bitmap để quyết định bảng nào ("Heap") khối nó cần kiểm tra.
jjanes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.