HINT文的简介

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;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13956325/viewspace-598287/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13956325/viewspace-598287/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值