Tại sao Oracle sử dụng chỉ mục ở đây?


7
Name     Null     Type      
-------- -------- --------- 
ID       NOT NULL NUMBER(4) 
GROUP_ID          NUMBER(4) 
TEXT              CLOB      

Có một chỉ số btree trên group_id. Dưới đây là mỗi hàng group_idcó bao nhiêu hàng và tỷ lệ phần trăm tương ứng:

GROUP_ID               COUNT                  PCT                    
---------------------- ---------------------- ---------------------- 
1                      1                      1                      
2                      2                      1                      
3                      4                      3                      
4                      8                      6                      
5                      16                     12                     
6                      32                     24                     
7                      64                     47                     
8                      9                      7                      

Tôi chạy cái này

EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'TEST', cascade=>true);

Mà, nếu tôi hiểu chính xác, sẽ thu thập số liệu thống kê cho trình tối ưu hóa.

Bây giờ, tôi nhớ rằng Oracle sẽ không sử dụng chỉ mục và thực hiện quét toàn bộ bảng thay vào đó nếu nó truy xuất hơn 5% hoặc hơn tất cả các hàng. Tuy nhiên, khi tôi chạy truy vấn này, nó chỉ bắt đầu thực hiện FTS khi group_id7, có 47% tất cả các hàng.

Đây có phải là cách nó phải được?


2
Bạn có thể cho chúng tôi truy vấn?
Leigh Riffel

@LeighSELECT * FROM my_table WHERE group_id = X
NullUserException

Câu trả lời:


3

Tôi nhớ rằng Oracle sẽ không sử dụng chỉ mục và thực hiện quét toàn bộ bảng thay vào đó nếu nó truy xuất hơn 5% hoặc hơn tất cả các hàng.

Đây là một "quy tắc của ngón tay cái" và không nên được coi là một dự đoán. Oracle CBO chọn một kế hoạch thực hiện dựa trên 'chi phí' ước tính của các tùy chọn. Chi phí ước tính sẽ phụ thuộc vào các tham số khác nhau và độ phức tạp tăng lên với mỗi bản phát hành Oracle.

Bạn có thể sử dụng các gợi ýexplain planđể có được ý tưởng chi tiết hơn về chi phí tương đối của hai kế hoạch - nhưng điều này nên được thực hiện trong một truy vấn duy nhất vì 'chi phí' không được đảm bảo là một thước đo tuyệt đối ngoài một kế hoạch:

select /*+ FULL(foo) */ * from foo where group_id=10
union all
select /*+ INDEX(i_foo) */ * from foo where group_id=10;

ví dụ giải thích kế hoạch với chi phí tương đối

Đây có phải là cách nó phải được?

Tóm lại: Có.

Trừ khi bạn đã xác định được một vấn đề hiệu suất cụ thể, bạn nên tin tưởng CBO để chọn đúng đường dẫn (và không, ví dụ, sử dụng các gợi ý ngoại trừ để thử nghiệm và thử nghiệm như trên). Nếu bạn đã xác định được một vấn đề, bước tiếp theo là bắt đầu điều tra xem liệu CBO có đưa ra các giả định không chính xác hay không và làm thế nào để cung cấp cho nó thông tin tốt hơn - thay vì cho rằng nó bị hỏng và / hoặc cố gắng phá vỡ nó.


4

Oracle cũng theo dõi số lượng khối sẽ được lấy bằng các giá trị chỉ mục. Nó có thể là dữ liệu của bạn được nhóm bởi group_id. Trong trường hợp đó, có thể có ý nghĩa khi sử dụng chỉ mục khi truy xuất hơn 5% số hàng. Nếu dữ liệu được phân cụm đủ cho các giá trị 5 và 6, thì việc sử dụng chỉ mục có thể gần tương đương với việc quét toàn bộ bảng của một vài khối.

Việc tính toán có liên quan sẽ liên quan đến số lượng khối chỉ mục cần được truy xuất, số lượng khối dữ liệu cần được truy xuất và CPU cần để truy cập dữ liệu. Có các tham số điều chỉnh điều chỉnh chi phí tương đối của việc truy xuất chỉ mục so với các khối dữ liệu. Điều này có thể thay đổi kế hoạch đang được sử dụng.

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.