Tôi đang thử nghiệm các truy vấn khác nhau và tôi tò mò về cách db quyết định sử dụng Bitmap Heap Scan và Index Scan.Làm thế nào Bitmap Heap Scan và Index Scan được quyết định?
tạo chỉ mục customers_email_idx trên khách hàng (email varchar_pattern_ops);
Như bạn có thể thấy có bảng khách hàng (ví dụ dellstore) và tôi thêm chỉ mục vào cột email.
truy vấn đầu tiên là ở đây:
select * from khách hàng nơi email như 'ITQ%@dell.com'; -> truy vấn với Index Scan
Giải thích phân tích truy vấn là ở đây:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Index Scan using customers_email_idx on customers (cost=0.00..8.27 rows=2 width=268) (actual time=0.046..0.046 rows=0 loops=1)
Index Cond: (((email)::text ~>=~ 'ITQ'::text) AND ((email)::text ~<~ 'ITR'::text))
Filter: ((email)::text ~~ 'ITQ%@dell.com
'::text)
Total runtime: 0.113 ms
truy vấn khác là ở đây:
select * from khách hàng nơi email như 'CNTT% @ dell.com '; -> truy vấn với Bitmap Heap Scan
Giải thích phân tích truy vấn là ở đây:
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on customers (cost=4.54..106.77 rows=2 width=268) (actual time=0.206..0.206 rows=0 loops=1)
Filter: ((email)::text ~~ 'IT%@dell.com
'::text)
-> Bitmap Index Scan on customers_email_idx (cost=0.00..4.54 rows=29 width=0) (actual time=0.084..0.084 rows=28 loops=1)
Index Cond: (((email)::text ~>=~ 'IT'::text) AND ((email)::text ~<~ 'IU'::text))
Total runtime: 0.273 ms
bạn có thể giải thích lý do tại sao ví dụ này Bitmap và Index Scan được sử dụng ở đây?
Cảm ơn bạn ..
Xem câu trả lời của @ araqnid và điều này: http : //wiki.postgresql.org/images/4/45/Explaining_EXPLAIN.pdf Tìm 'quét chỉ mục'. Chìa khóa có thể là 'trình tối ưu hóa có thể chọn nó [quét bitmap] cho bất kỳ quét có thể lập chỉ mục nào với độ chọn lọc thấp' – dezso
Tôi nghĩ câu hỏi này sẽ phù hợp với chỉ trên dba.SE. –