说明
1.整理了一些本人平时SQL 调优中常用到的一些Hint,方便大家参考
2.Hint相关文章地址:
Oracle Hint之概念与用法: http://blog.itpub.net/69992972/viewspace-2756965/
Oracle Hint之常用Hint功能概述(一): http://blog.itpub.net/69992972/viewspace-2757087/
Oracle Hint之常用Hint功能概述(二): http://blog.itpub.net/69992972/viewspace-2757182/
Oracle Hint之常用Hint功能概述(三): http://blog.itpub.net/69992972/viewspace-2757238/
Oracle Hint之常用Hint功能概述(四): http://blog.itpub.net/69992972/viewspace-2757242/
Oracle Hint之常用Hint功能概述(五): http://blog.itpub.net/69992972/viewspace-2757273/ 查询转换Hint
|
Hint 名 |
功能概述 |
举例 |
|
/*+ no_query_transformation */ |
该hint让优化器跳过所有查询转换,包括但不限于OR操作转换、视图合并、子查询非嵌套,星形转换和物化视图重写 |
SELECT /*+ NO_QUERY_TRANSFORMATION */ employee_id, last_name FROM (SELECT * FROM emp e) v WHERE v.last_name = 'James'; |
|
/*+ no_expand */ |
该hint让优化器不要对WHERE子句中具有OR条件或IN列表的查询使用union all的方式。通常,优化器会考虑使用union all,并在确定成本低于不使用它的情况下使用此方法 |
|
|
/*+ expand_table(tab) */ |
该hint让优化器在不考虑成本的情况下,对目标SQL中的目标表进行表扩展 |
|
|
/*+ no_expand_table(tab) */ |
不让优化器对目标SQL中的目标表进行表扩展 |
|
|
/*+ unnest */ |
该hint让优化器取消嵌套并将子查询的主体合并到包含它的查询块的主体中,从而使优化器在评估访问路径和联接时将它们一起考虑(将子查询和主查询合并)。在取消嵌套子查询之前,优化器首先验证该语句是否有效。然后,该语句必须通过启发式和查询优化测试。UNNEST提示指示优化器仅检查子查询块的有效性。如果子查询块有效,那么将启用子查询取消嵌套,而无需检查启发式方法或成本。 |
|
|
/*+ no_unnest */ |
关闭unnest |
|
|
/*+ star_transformation */ |
该hint让优化器强制对星型模型的访问转换为子查询,并按bitmap索引进行访问 |
SELECT /*+ STAR_TRANSFORMATION */ s.time_id, s.prod_id, s.channel_id FROM sales s, times t, products p, channels c WHERE s.time_id = t.time_id AND s.prod_id = p.prod_id AND s.channel_id = c.channel_id AND c.channel_desc = 'Tele Sales'; |
|
/*+ fact(tab) */ |
与star_transformation配合,指定某个表为事实表(fact table) |
|
|
/*+ no_fact(tab) */ |
与star_transformation配合,取消某个表作为事实表(fact table) |
|
|
/*+ rewrite */ |
该hint让优化器尽可能在不考虑成本的情况下根据物化视图重写查询。在有或没有视图列表的情况下使用REWRITE提示。如果将REWRITE与视图列表一起使用,并且该列表包含合格的物化视图,则Oracle会使用该视图,而不考虑其成本。Oracle不在列表之外考虑视图。如果未指定视图列表,则Oracle会搜索合格的物化视图并始终使用该视图,而不考虑最终计划的成本 |
|
|
/*+ no_rewrite */ |
关闭rewrite |
|
|
/*+ merge */ |
如果视图的查询块在SELECT列表中包含GROUP BY子句或DISTINCT运算符,则只有启用了复杂的视图合并后,优化器才能将视图合并到访问语句中。如果子查询不相关,则也可以使用复杂合并将IN子查询合并到访问语句中 |
SELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary FROM emp e1, (SELECT department_id, avg(salary) avg_salary FROM emp e2 GROUP BY department_id) v WHERE e1.department_id = v.department_id AND e1.salary > v.avg_salary ORDER BY e1.last_name; |
|
/*+ no_merge */ |
阻止奖复杂视图和与调用该视图的语句合并 |
|
|
/*+ push_pred */ |
该hint让指示优化器把联接谓词推入视图(让谓词成为视图的一部分先执行) |
SELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ * FROM emp e, (SELECT manager_id FROM emp) v WHERE e.manager_id = v.manager_id(+) AND e.employee_id = 100; |
|
/*+ no_push_pred */ |
不让优化器把联接谓词推入视图 |
|
|
/*+ push_subq */ |
该hint让优化器在执行计划的最开始的步骤中先执行未合并的子查询。 通常,未合并的子查询将作为执行计划中的最后一步执行。如果子查询相对便宜,并且大大减少了行数,那么更早地评估子查询可以提高性能。如果子查询应用于远程表或使用合并联接进行联接的子查询,则此hint无效 |
|
|
/*+ no_push_subq */ |
让优化器最后执行目标SQL中不能做子查询展开的子查询 |
并行Hint
|
Hint 名 |
功能概述 |
举例 |
|
/*+ parallel */ |
该hint让优化器将指定数量的并发服务器用于并行操作。 此提示将覆盖PARALLEL_DEGREE_POLICY初始化参数的值。它适用于SELECT、INSERT、MERGE、UPDATE和DELETE语句,以及表扫描部分。如果违反了任何并行限制,则忽略hint |
SELECT /*+ PARALLEL(4) */ last_name FROM emp; |
|
/*+ no_parallel */ |
取消并行 |
|
|
/*+ parallel_index(tab idx_name, n) */ |
该hint让优化器使用指定数量的并发服务器来并行化分区范围的索引范围扫描、完整扫描和快速完整扫描。整数值表示指定索引的并行度。指定DEFAULT或不指定任何值表示查询协调器应检查初始化参数的设置以确定默认的并行度 |
|
|
/*+ no_parallel_index(tab idx_name) */ |
该hint不让优化器使用并发服务器来并行化分区范围的索引范围扫描、完整扫描和快速完整扫描。 |
