2012-09-04 18 views
5

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 ..

+1

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

+1

Tôi nghĩ câu hỏi này sẽ phù hợp với chỉ trên dba.SE. –

Trả lời

6

Bạn có tổng số hàng trong bảng? Quyết định dựa trên tỷ lệ của các hàng sẽ được xuất ra bằng cách quét chỉ mục.

Nếu một tỷ lệ đủ cao của bảng sẽ được truy cập, quét chỉ mục bitmap được sử dụng để đảm bảo rằng càng nhiều quyền truy cập đĩa càng tốt là tuần tự. Ngược lại, quét chỉ mục đơn giản thực hiện truy cập ngẫu nhiên một trang tại một thời điểm vào dữ liệu bảng. (Và nếu tỷ lệ của bảng được dự kiến ​​được truy cập đủ cao, chỉ mục đó không được sử dụng chút nào và toàn bộ dữ liệu bảng được tải tuần tự)

Một vấn đề là chiếu bao nhiêu hàng từ bảng sẽ được truy cập chỉ là ước tính. Nhưng như bạn có thể tưởng tượng, 'IT%' có khả năng khớp hơn 'ITQ%' (nhớ rằng hậu tố không phải là một phần của quét chỉ mục, chỉ có bộ lọc cuối cùng)

+0

Tổng số hàng: 20.000 - hàng được tìm thấy bằng cách quét chỉ mục: 5 - hàng được tìm thấy bởi bitmap: 6 – TraviJuu

Các vấn đề liên quan