当前位置:  开发笔记 > 编程语言 > 正文

Oracle优化器是否会在同一个SELECT中使用多个提示?

如何解决《Oracle优化器是否会在同一个SELECT中使用多个提示?》经验,为你挑选了1个好方法。

我正在尝试优化查询性能,不得不求助于使用优化器提示.但是我从来没有学过优化器是否会一次使用多个提示.

例如

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

谢谢,



1> Dave Costa..:

尝试在单个注释块中指定所有提示,如本例中的精彩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;

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有