2013-07-16 41 views
8

Tôi rất mới để lập chỉ mục và giải thích kế hoạch, vì vậy hãy chịu với tôi! Tôi đang cố điều chỉnh truy vấn nhưng tôi gặp sự cố.Oracle không sử dụng chỉ mục khi tham gia

Tôi có hai bảng:

SKU 
------ 
SKUIDX (Unique index) 
CLRIDX (Index) 
.. 
.. 

IMPCOST_CLR 
----------- 
ICCIDX (Unique index) 
CLRIDX (Index) 
... 
.. 

Khi tôi làm một select * from SKU where clridx = 122, tôi có thể thấy rằng nó đang sử dụng các chỉ số trong kế hoạch giải thích (nó nói BẢNG TIẾP CẬN .. INDEX, nó nói tên chỉ số dưới OBJECT_NAME và các tùy chọn là RANGE SCAN).

Bây giờ, khi tôi cố gắng tham gia trên cùng một trường, nó không xuất hiện để sử dụng chỉ mục (nó nói TABLE ACCESS .. HASH JOIN và dưới tùy chọn, nó nói ĐẦY ĐỦ).

Tôi nên tìm cách thử và xem lý do tại sao nó không sử dụng chỉ mục? Xin lỗi, tôi không chắc chắn lệnh nào sẽ nhập để hiển thị thông tin này, vì vậy, vui lòng cho tôi biết nếu bạn cần thêm thông tin.

Ví dụ:
1 truy vấn:

SELECT 
    * 
    FROM 
    AP21.SKU 
    WHERE 
    CLRIDX = 100 

enter image description here

2 truy vấn:

SELECT 
    * 
    FROM 
    AP21.IMPCOST_CLR 
    WHERE 
    CLRIDX = 100 

enter image description here

3rd truy vấn:

SELECT 
    * 
    FROM 
    AP21.SKU 
    INNER JOIN 
    AP21.IMPCOST_CLR ON 
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX 

enter image description here

+0

gì được truy vấn mà bạn sử dụng khi tham gia? – APC

+0

Xin chào, tôi đã xem bản chỉnh sửa của tôi. Các truy vấn im cố gắng để điều chỉnh là hàng trăm lâu hơn nữa, nhưng phá vỡ nó xuống và dùng nó từng bước! – Lock

+0

Bạn giải quyết vấn đề quét toàn bộ của mình như thế nào? – Salman

Trả lời

17

Nhìn vào truy vấn này:

SELECT 
    * 
FROM 
    AP21.SKU 
INNER JOIN 
    AP21.IMPCOST_CLR ON 
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX 

Nó không có vị bổ sung. Vì vậy, bạn đang tham gia tất cả các hàng trong SKU với tất cả các hàng trong IMPCOST_CLR. Hơn nữa bạn đang chọn tất cả các cột từ cả hai bảng.

Điều này có nghĩa là Oracle phải đọc toàn bộ cả hai bảng. Cách hiệu quả nhất để thực hiện việc này là sử dụng tính năng Quét Bảng Toàn bộ, để tìm kiếm tất cả các hàng trong lần đọc nhiều khối và sử dụng băm để khớp với các giá trị của phép nối.

Về cơ bản, đó là một hoạt động được đặt, đó là những gì SQL thực hiện rất tốt, trong khi các lần đọc được lập chỉ mục có nhiều hơn RBAR. Bây giờ, nếu bạn thay đổi các truy vấn thứ ba để bao gồm một vị bổ sung, chẳng hạn như

WHERE SKU.CLRIDX = 100 

bạn sẽ rất có thể xem đường dẫn truy cập trở lại INDEX PHẠM VI SCAN. Vì bạn chỉ chọn một số hàng so sánh nên đọc được lập chỉ mục là đường dẫn hiệu quả hơn một lần nữa.


"The im truy vấn cố gắng để điều chỉnh là hàng trăm lâu hơn nữa, nhưng phá vỡ nó xuống và lấy nó từng bước!"

Đây là một kỹ thuật tốt nhưng bạn cần phải hiểu cách hoạt động của trình tối ưu hóa Oracle. Có rất nhiều thông tin trong Kế hoạch Giải thích.Find out more. Chú ý đến giá trị trong cột Rows cho mỗi bước. Điều đó cho bạn biết có bao nhiêu hàng mà Trình tối ưu hóa dự kiến ​​nhận được từ hoạt động. Bạn sẽ thấy các giá trị rất khác nhau cho hai truy vấn đầu tiên so với thứ ba.

+0

Có cách nào để tránh quét toàn bộ trong trường hợp này không? – Salman

+0

@salman - trong trường hợp này Quét toàn bộ bảng là cách hiệu quả nhất để truy cập dữ liệu. Vậy tại sao bạn muốn tránh nó? – APC

5

Bây giờ, khi tôi cố gắng tham gia vào các lĩnh vực tương tự, nó không xuất hiện sử dụng chỉ số (nó nói BẢNG TIẾP CẬN .. HASH JOIN và dưới tùy chọn, nó nói ĐẦY ĐỦ).

Đó là vì HASH THAM GIA không sử dụng (cần) lập chỉ mục trên các vị từ tham gia:

http://use-the-index-luke.com/sql/join/hash-join-partial-objects