【TUNE_ORACLE】Oracle Hint之概念与用法

来源:这里教程网 时间:2026-03-03 16:28:09 作者:

说明 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/ 什么是Hint1. 1Hint这个单词直译过来就是“提示;暗示”,是一种人为主动传达给SQL优化器的“提示”(指令)用来干预SQL解析策略信息的一种重要手段,除非某些条件阻止(下文有举例说明),否则优化器会使用hint为语句选择执行计划; 通俗解释hint就是:如果你觉得SQL优化器的执行计划不符合你的预期,你就可通过使用hint去主动去调整SQL的执行计划。2. Hint表现形式是一种嵌入在SQL语句中特殊的注释。 3. 需要注意,仅在收集了有关表的统计信息并评估了优化器计划之后,才应“谨慎使用”Hint。更改数据库条件以及在后续发布Oracle新版本中查询性能的增强可能会对原来代码中的Hint性能产生重大改变! Hint语法虽然hint是一种特殊的注释,但归根结底写法还是注释的写法,但略有区别,具体写法如下: 1. Hint注释必须紧跟在SQL语句块的第一个关键字之后。 可以使用两种注释方式:斜杠( /* )或破折号( -- )。 加号( + )提示定界符必须紧跟在注释定界符之后, 加号前不允许有空格,但 加号后的空格是可选的

SELECT /*+ hint内容 */ FROM table;

2. 语句块只能有一个包含提示的注释,但它可以包含许多以空格分隔的提示。 将多个hints至少隔开一个空格:

SELECT /*+ FULL(hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp;

Hint类型 1.单表使用hint时,只把一张表或一个视图的全称或别名写入hint中,如:

SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id FROM employees WHERE department_id > 50;

2.多表 使用hint时,多张表或多个视图的全称或别名写入hint中,同时作用于多张表和视图,如:

SELECT /*+ LEADING(e j) */ * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date;

注:USE_NL(table1 table2)不是多表hint,因为它是USE_NL(table1)和USE_NL(table2)因为它是简化写法。 3.查询块查询块提示对单个查询块起作用,比如hint里的STAR_TRANSFORMATION和UNNEST。以下语句使用查询块hint来指定该hint里的FULL仅作用于引用的employees的查询块:

SELECT /*+ INDEX(t1) FULL( t1) */ COUNT(*) FROM jobs t1 WHERE t1.job_id IN (SELECT job_id FROM employees t1);

注:hint生效范围仅限于它本身所在的查询块,如果不指定查询块作用区域,它的默认生效范围就是该hint自身所处的查询块。 4.Statement Statement hint适用于整个SQL语句,比如ALL_ROWS:

SELECT /*+ ALL_ROWS */ * FROM emp;

Hint适用范围1.简单的MERGE,SELECT,INSERT,UPDATE,或DELETE语句2.父语句(parent statement)或复杂语句的子查询3.使用的运算符集合的查询的一部分(UNION,MINUS,INTERSECT) Hint其他注意事项1.一般使用了hint之后,优化器默认使用CBO模式(除DRIVING_SITE和RULE可以在RBO使用并且不会启用CBO以外) 2.如果hint里的表和视图在SQL中有别名,在hint里必须使用别名3.hint里的表名、视图名和索引名之前不能带上schema,如user.table这种形式就不合法4.导致hint失效的原因(会直接当普通注释处理):1)hint不合法2)hint在某些特定SQL中直接失效,如标量子查询想用USE_NL和LEADING指定子查询里的表为驱动表(该类型语句的驱动表必为主表)3)有查询转换4)多个hint互斥,直接会把这些hint直接无效化,如既使用INDEX又使用FULL5)hint拼写错误6)hint会直接导致SQL执行结果出错

相关推荐