Tôi sẽ cố gắng giải thích những hiểu lầm của tôi bằng ví dụ sau.
Tôi đã không hiểu các nguyên tắc cơ bản của Bitmap Heap Scan Node
. Hãy xem xét các truy vấn SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
kế hoạch đó là:
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)
Sự hiểu biết của tôi về nút này :
Như đã giải thích ở đó , các bitmap heap scan
khối bảng đọc theo thứ tự tuần tự, do đó nó không tạo ra chi phí truy cập bảng ngẫu nhiên, điều này xảy ra như đang làm Index Scan
.
Sau khi Index Scan
hoàn thành, PostgreSQL không biết cách tìm nạp các hàng một cách tối ưu, để tránh không cần thiết heap blocks reads
(hoặc hits
nếu có bộ đệm nóng). Vì vậy, để tìm ra nó, nó tạo ra cấu trúc ( Bitmap Index Scan
) được gọi là bitmap
trong trường hợp của tôi đang được tạo bằng cách tạo hai bitmap của các chỉ mục và thực hiện BITWISE AND
. Vì bitmap đã được tạo nên giờ đây nó có thể đọc bảng một cách tối ưu theo thứ tự liên tục, tránh không cần thiết heap I/O-operations
.
Đó là nơi có rất nhiều câu hỏi.
HỎI: Chúng tôi chỉ có một bitmap. Làm thế nào để PostgreSQL biết chỉ bằng một bitmap bất cứ thứ gì về thứ tự vật lý của hàng? Hoặc tạo bitmap để bất kỳ phần tử nào của nó có thể được ánh xạ tới con trỏ tới một trang dễ dàng? Nếu vậy, điều đó giải thích mọi thứ, nhưng đó chỉ là phỏng đoán của tôi.
Vì vậy, chúng ta có thể nói đơn giản rằng bitmap heap scan -> bitmap index scan
nó giống như một lần quét liên tiếp nhưng chỉ là phần thích hợp của bảng không?
001001010101011010101
. Hoặc nó thực sự không quan trọng và tất cả những gì chúng ta phải biết chỉ là nó có thể tìm thấy một khối bằng bitmap theo cách khá nhanh ...?