我正在尝试优化查询性能,不得不求助于使用优化器提示.但是我从来没有学过优化器是否会一次使用多个提示.
例如
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;
解释计划显示相同的成本,但我知道这只是一个估计.
请假设已计算所有表和索引统计信息.仅供参考,索引dcf_vol_prospect_ids_idx位于i.solicitor_id列上.
谢谢,
炖
尝试在单个注释块中指定所有提示,如本例中的精彩Oracle文档(http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm)所示.
16.2.1指定一组完整的提示
使用提示时,在某些情况下,您可能需要指定一整套提示以确保最佳执行计划.例如,如果您有一个非常复杂的查询(由许多表连接组成),并且如果仅指定给定表的INDEX提示,则优化程序需要确定要使用的剩余访问路径以及相应的加入方法.因此,即使您提供了INDEX提示,优化程序也可能不一定使用该提示,因为优化程序可能已确定由于优化程序选择的连接方法和访问路径而无法使用所请求的索引.
在例16-1中,LEADING提示指定要使用的确切连接顺序; 还指定了在不同表上使用的连接方法.
示例16-1指定一组完整的提示
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;