概述
Oracle的HINT(提示)处理是在Oracle产生的SQL分析执行路径不满意的情况下要用到的。即在SQL文的基础上ORACLE自动生成的实行
计划没有达到最佳化(受SQL文的影响和自身的语法规则)的时候,对Oracle进行提示,希望按照提示的来处理SQL文,改进实行计划,
从而达到优化的目的。
Oracle的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给Oracle执行的一个建议,有时如果出于成本方面的考虑
Oracle也可能不会按提示进行。根据实践应用,除了最常用的INDEX等几个HINT文之外,一般不建议开发人员应用Oracle提示,因为各个数
据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,Oracle在SQL执行分析方面已经比较成熟,如果分析
执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是
否正确这几方面分析。
1、加了HINT文的SQL文。
[SELECT文]:
SELECT /*+ HINT1
HINT2 */
TABLE名(別名).COLUMN名, /*列名の説明*/
TABLE名(別名).COLUMN名, /*列名の説明*/
...
FROM TABLE名 別名, ...
WHERE CONDITION1
AND CONDITION2
OR CONDITION3;
[UPDATE文]:
UPDATE /*+HINT1
HINT2*/
TABLE名 別名
SET TABLE名(別名).COLUMN名 /*列名の説明*/
WHERE CONDITION;
[INSERT文]:
INSERT /*+HINT1
HINT2*/
INTO TABLE名
(COLUMN名1,
COLUMN名2,
...)
VALUES (値1,
値2,
...);
[DELETE文]:
DELETE /*+HINT1
HINT2*/
FROM TABLE名 別名
WHERE CONDITION;
2、HINT文的种类。
[目标方面的提示]:
COST(CBO,按成本优化)
RULE(RBO,按规则优化,但此HINT文在高版本Oracle里可不使用)
CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
ALL_ROWS(所有的行尽快返回)
FIRST_ROWS(第一行数据尽快返回)
[查询方面的提示]:
AND_EQUAL
CLUSTER
FULL
HASH
INDEX、NO_INDEX(使用、不使用提示的表索引进行查询)
INDEX_ASC、INDEX_DESC
INDEX_COMBINE
INDEX_FFS
ROWID
[结合顺序方面的提示]:
ORDERED
STAR
[结合操作方面的提示]:
DRIVING_SITE
HASH_SJ、MERGE_SJ、NL_SJ
LEADING
USE_HASH、USE_MERGE(使用HASH JOIN方式、MERGE JOIN方式联合)
USE_NL(使用NESTED LOOPS方式联合)
[并行处理方面的提示]:
PARALLEL、NOPARALLEL
PARALLEL_INDEX
PQ_DISTRIBUTE
NOPARALLEL_INDEX
[询问变换方面的提示]:
EXPAND_GSET_TO_UNION
FACT、NOFACT
MERGE
NO_EXPAND
NO_MERGE
REWRITE、NOREWRITE
STAR_TRANSPORMATION
USE_CONCAT
[其他方面的提示]:
APPEND、NOAPPEND
CACHE、NOCACHE
CURSOR_SHARING_EXACT
DYNAMIC_SAMPLING
NESTED_TABLE_GET_REFS
UNNEST、NO_UNNEST
ORDERED_PREDICATES
PUSH_PRED、NO_PUSH_PRED
PUSH_SUBQ
3、常用几种HINT文用法介绍。
3.1、INDEX的HINT文
[机能]:强制使用指定的索引。
[语法]:
SELECT /*+ INDEX(表(別)名, 索引名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ INDEX(EMP, DEPT_IDX) */ DEPT_NO FROM EMP;
[例2]:SELECT /*+ INDEX(A, DEPT_IDX) */ A.DEPT_NO FROM EMP A;
[例3]:SELECT /*+ INDEX(A) */ A.DEPT_NO FROM EMP A;
[注意点]:
<1>、HINT文中表(別)名,也适用于同义词名。
<2>、若表使用了别名,则HINT文中也必须使用别名,而不能用表名,如[例2],否则此HINT文无效。
<3>、INDEX的HINT文中,表(別)名必须指定。
<4>、如例3不写索引名也可以,就由Oracle的自动选择此表的索引,这种用法需要特别注意。
一般常用例2。
3.2、FULL的HINT文
[机能]:强制对表进行全表检索,而不利用索引。
[语法]:
SELECT /*+ FULL(表(別)名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ FULL(A) */ A.DEPT_NO FROM EMP A;
[注意点]:
如果Oracle自动根据WHERE子句中的条件使用了索引,但是此索引带来的开销要大于其提高的检索成本,则需要强制指定此表为
全表检索,而不是利用INDEX。
3.3、NO_INDEX的HINT文
[机能]:强制不使用指定的索引。
[语法]:
SELECT /*+ NO_INDEX(表(別)名, 索引名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ NO_INDEX(A, DEPT_IDX) */ A.DEPT_NO FROM EMP A;
[注意点]:
如果不希望使用某一个索引,又不希望全表检索时,可以强制指定这个不希望使用的索引,Oracle会采用此表的其他索引。
3.4、AND_EQUAL的HINT文
[机能]:使用复数个指定的索引。
[语法]:
SELECT /*+ AND_EQUAL(表(別)名, 索引名1, 索引名2,...) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ AND_EQUAL(A, DEPT_IDX, JOB_IDX) */ A.DEPT_NO
FROM EMP A
WHERE A.DEPT_NO = 10 AND A.JOB_NO = 20;
[注意点]:
索引最多可以写5个。
3.5、LEADING的HINT文
[机能]:将指定的表作为连接次序中的首表。
[语法]:
SELECT /*+ LEADING(表(別)名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ LEADING(A) */ A.DEPT_NO
FROM EMP A, DTL B
WHERE B.DTL_NO = 10 AND B.JOB_NO = A.JOB_NO AND A.DEPT_NO=5;
[注意点]:
可以指定数据量小的表为基础表,再来关联其他表,降低开销,提高实行速度。
3.6、USE_NL的HINT文
[机能]:将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表。
[语法]:
SELECT /*+ USE_NL(表(別)名1, 表(別)名12,...) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ USE_NL(A, B) */ DEPT_NO
FROM EMP A, DTL B
WHERE A.DPT_NO = B.DPT_NO;
计划没有达到最佳化(受SQL文的影响和自身的语法规则)的时候,对Oracle进行提示,希望按照提示的来处理SQL文,改进实行计划,
从而达到优化的目的。
Oracle的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给Oracle执行的一个建议,有时如果出于成本方面的考虑
Oracle也可能不会按提示进行。根据实践应用,除了最常用的INDEX等几个HINT文之外,一般不建议开发人员应用Oracle提示,因为各个数
据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,Oracle在SQL执行分析方面已经比较成熟,如果分析
执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是
否正确这几方面分析。
1、加了HINT文的SQL文。
[SELECT文]:
SELECT /*+ HINT1
HINT2 */
TABLE名(別名).COLUMN名, /*列名の説明*/
TABLE名(別名).COLUMN名, /*列名の説明*/
...
FROM TABLE名 別名, ...
WHERE CONDITION1
AND CONDITION2
OR CONDITION3;
[UPDATE文]:
UPDATE /*+HINT1
HINT2*/
TABLE名 別名
SET TABLE名(別名).COLUMN名 /*列名の説明*/
WHERE CONDITION;
[INSERT文]:
INSERT /*+HINT1
HINT2*/
INTO TABLE名
(COLUMN名1,
COLUMN名2,
...)
VALUES (値1,
値2,
...);
[DELETE文]:
DELETE /*+HINT1
HINT2*/
FROM TABLE名 別名
WHERE CONDITION;
2、HINT文的种类。
[目标方面的提示]:
COST(CBO,按成本优化)
RULE(RBO,按规则优化,但此HINT文在高版本Oracle里可不使用)
CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
ALL_ROWS(所有的行尽快返回)
FIRST_ROWS(第一行数据尽快返回)
[查询方面的提示]:
AND_EQUAL
CLUSTER
FULL
HASH
INDEX、NO_INDEX(使用、不使用提示的表索引进行查询)
INDEX_ASC、INDEX_DESC
INDEX_COMBINE
INDEX_FFS
ROWID
[结合顺序方面的提示]:
ORDERED
STAR
[结合操作方面的提示]:
DRIVING_SITE
HASH_SJ、MERGE_SJ、NL_SJ
LEADING
USE_HASH、USE_MERGE(使用HASH JOIN方式、MERGE JOIN方式联合)
USE_NL(使用NESTED LOOPS方式联合)
[并行处理方面的提示]:
PARALLEL、NOPARALLEL
PARALLEL_INDEX
PQ_DISTRIBUTE
NOPARALLEL_INDEX
[询问变换方面的提示]:
EXPAND_GSET_TO_UNION
FACT、NOFACT
MERGE
NO_EXPAND
NO_MERGE
REWRITE、NOREWRITE
STAR_TRANSPORMATION
USE_CONCAT
[其他方面的提示]:
APPEND、NOAPPEND
CACHE、NOCACHE
CURSOR_SHARING_EXACT
DYNAMIC_SAMPLING
NESTED_TABLE_GET_REFS
UNNEST、NO_UNNEST
ORDERED_PREDICATES
PUSH_PRED、NO_PUSH_PRED
PUSH_SUBQ
3、常用几种HINT文用法介绍。
3.1、INDEX的HINT文
[机能]:强制使用指定的索引。
[语法]:
SELECT /*+ INDEX(表(別)名, 索引名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ INDEX(EMP, DEPT_IDX) */ DEPT_NO FROM EMP;
[例2]:SELECT /*+ INDEX(A, DEPT_IDX) */ A.DEPT_NO FROM EMP A;
[例3]:SELECT /*+ INDEX(A) */ A.DEPT_NO FROM EMP A;
[注意点]:
<1>、HINT文中表(別)名,也适用于同义词名。
<2>、若表使用了别名,则HINT文中也必须使用别名,而不能用表名,如[例2],否则此HINT文无效。
<3>、INDEX的HINT文中,表(別)名必须指定。
<4>、如例3不写索引名也可以,就由Oracle的自动选择此表的索引,这种用法需要特别注意。
一般常用例2。
3.2、FULL的HINT文
[机能]:强制对表进行全表检索,而不利用索引。
[语法]:
SELECT /*+ FULL(表(別)名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ FULL(A) */ A.DEPT_NO FROM EMP A;
[注意点]:
如果Oracle自动根据WHERE子句中的条件使用了索引,但是此索引带来的开销要大于其提高的检索成本,则需要强制指定此表为
全表检索,而不是利用INDEX。
3.3、NO_INDEX的HINT文
[机能]:强制不使用指定的索引。
[语法]:
SELECT /*+ NO_INDEX(表(別)名, 索引名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:SELECT /*+ NO_INDEX(A, DEPT_IDX) */ A.DEPT_NO FROM EMP A;
[注意点]:
如果不希望使用某一个索引,又不希望全表检索时,可以强制指定这个不希望使用的索引,Oracle会采用此表的其他索引。
3.4、AND_EQUAL的HINT文
[机能]:使用复数个指定的索引。
[语法]:
SELECT /*+ AND_EQUAL(表(別)名, 索引名1, 索引名2,...) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ AND_EQUAL(A, DEPT_IDX, JOB_IDX) */ A.DEPT_NO
FROM EMP A
WHERE A.DEPT_NO = 10 AND A.JOB_NO = 20;
[注意点]:
索引最多可以写5个。
3.5、LEADING的HINT文
[机能]:将指定的表作为连接次序中的首表。
[语法]:
SELECT /*+ LEADING(表(別)名) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ LEADING(A) */ A.DEPT_NO
FROM EMP A, DTL B
WHERE B.DTL_NO = 10 AND B.JOB_NO = A.JOB_NO AND A.DEPT_NO=5;
[注意点]:
可以指定数据量小的表为基础表,再来关联其他表,降低开销,提高实行速度。
3.6、USE_NL的HINT文
[机能]:将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表。
[语法]:
SELECT /*+ USE_NL(表(別)名1, 表(別)名12,...) */
字段1, 字段2, ...
FROM 表名, ...
[例1]:
SELECT /*+ USE_NL(A, B) */ DEPT_NO
FROM EMP A, DTL B
WHERE A.DPT_NO = B.DPT_NO;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13956325/viewspace-598287/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13956325/viewspace-598287/
最后
以上就是健壮冬天为你收集整理的HINT文的简介的全部内容,希望文章能够帮你解决HINT文的简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复