2009-01-07 25 views
15

Tôi đang cố gắng tối ưu hóa hiệu suất truy vấn và phải sử dụng các gợi ý của trình tối ưu hóa. Nhưng tôi chưa bao giờ học được nếu trình tối ưu hóa sẽ sử dụng nhiều hơn một gợi ý tại một thời điểm.Trình tối ưu hóa Oracle có sử dụng nhiều gợi ý trong cùng một lệnh SELECT không?

ví dụ:

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/ 
     /*+ LEADING(i vol) */ 
     /*+ ALL_ROWS */ 
     i.id_number, 
     ... 
    FROM i_table i 
    JOIN vol_table vol on vol.id_number = i.id_number 
    JOIN to_a_bunch_of_other_tables... 
WHERE i.solicitor_id = '123' 
    AND vol.solicitable_ind = 1; 

Gói giải thích cho thấy cùng một chi phí, nhưng tôi biết đó chỉ là ước tính.

Hãy giả sử rằng tất cả các thống kê bảng và chỉ mục đã được tính toán. FYI, chỉ số dcf_vol_prospect_ids_idx nằm trên cột i.solicitor_id.

Cảm ơn,

Stew

Trả lời

19

Cố gắng xác định tất cả các gợi ý trong một khối bình luận duy nhất, như trong ví dụ này từ tài liệu của Oracle tuyệt vời (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm).

16.2.1 Xác định một bộ đầy đủ các gợi ý

Khi sử dụng gợi ý, trong một số trường hợp, bạn có thể cần phải chỉ định một bộ đầy đủ các gợi ý để đảm bảo kế hoạch thực hiện tối ưu. Ví dụ: nếu bạn có truy vấn rất phức tạp, trong đó bao gồm nhiều lần tham gia bảng và nếu bạn chỉ định gợi ý INDEX cho bảng đã cho, thì trình tối ưu hóa cần để xác định quyền truy cập còn lại đường dẫn , cũng như các phương thức kết hợp tương ứng . Do đó, ngay cả khi bạn đã đưa ra gợi ý INDEX, tôi ưu hoa có thể không nhất thiết sử dụng đó gợi ý, bởi vì tôi ưu hoa có thể đã xác định rằng chỉ số yêu cầu không thể được sử dụng do join phương pháp và đường dẫn truy cập bởi chọn trình tối ưu hóa.

Trong ví dụ 16-1, gợi ý HÀNG ĐẦU chỉ định thứ tự tham gia chính xác là được sử dụng; các phương thức kết hợp được sử dụng trên các bảng khác nhau cũng được chỉ định là .

Ví dụ 16-1 Chỉ định Full Set của gợi ý

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) 
      USE_MERGE(j) FULL(j) */ 
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal 
FROM employees e1, employees e2, job_history j 
WHERE e1.employee_id = e2.manager_id 
    AND e1.employee_id = j.employee_id 
    AND e1.hire_date = j.start_date 
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal; 
+0

Nếu có ai quan tâm, tôi đã thử cách này và Kế hoạch giải thích có cùng chi phí như trước đây. Ai biết được liệu CBO sẽ thực sự sử dụng nó! : -/ –

+0

Dave, Tôi đã chắc chắn RTFMed là chương, nhưng không bao giờ tình cờ gặp ví dụ tuyệt vời đó. Xin lỗi vì bài câm; Tôi thực sự cố gắng không làm điều đó!: -/ Cảm ơn, Hầm –

2

Trong thực tế, sự giới thiệu của Jonathan Lewis, tác giả của Cost-Based Oracle cơ bản là nếu CBO thất bại trong việc tìm đúng kế hoạch, bạn cần phải đảm nhận công việc của CBO và "các lớp" trong các gợi ý - trung bình hai gợi ý cho mỗi bảng trong truy vấn.

Lý do là một gợi ý có thể dẫn đến một kế hoạch tồi tệ hơn và thậm chí tệ hơn CBO sẽ không được trả tiền. Nếu CBO là sai, bạn cần phải cung cấp cho nó toàn bộ kế hoạch, không chỉ là một di chuyển đúng hướng.

+0

> Nếu CBO sai Điều đó có vẻ khá lớn nếu không? :-) Điểm thú vị. Từ những gì tôi đã đọc về Tom Kyte, anh ấy khuyên bạn nên làm mọi thứ khác có thể trước khi bạn sử dụng Gợi ý. –

+1

HOÀN TOÀN đồng ý. Nhưng CBO có thể và S W bị sai. Không có mã nào phức tạp bao giờ có thể hy vọng được hoàn hảo. Tôi là một tín đồ TK và anh ấy đúng. Chưa kể đến 90% lập trình viên và DBA không biết khi nào CBO thực sự sai và nó chỉ bị nói dối. –

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