Skip to content

HINT

功能描述

HINT是一种以固定的格式和位置出现在SQL文本中的特殊注释,其作用是指定执行计划,用户可通这种方式改变优化器对执行计划的规划,从而使SQL按更优的执行计划执。

语法格式

/*+HINT_TEXT*/

参数说明

HINT_TEXT目前支持以下选项:

  • INDEX(table_name index_name):指示对目标表使用索引扫描。
  • NOINDEX(table_name index_name):指示对目标表不使用指定索引。
  • FULL(table_name):指示对目标表使用全表扫描。
  • USE_HASH(table_name1,table_name2):指示目标表join路径使用hash join。

注意:

  • 若HINT_TEXT中指定的表在查询语句中指定了别名,则在HINT_TEXT中需使用此别名,否则HINT将失效。
  • +前不可存在空格,否则HINT将失效。

示例

先创建表并创建索引。

sql
-- 创建表并插入数据
SQL> CREATE TABLE t_hint (c1 INT, c2 INT);
 
SQL> BEGIN
    FOR i IN 1..10 LOOP
        INSERT INTO t_hint VALUES (i, i * 2);
    END LOOP;
END;
/

-- 创建索引
SQL> CREATE INDEX i_hint ON t_hint(c1);
  • 未使用HINT的查询执行计划:
    sql
    SQL> EXPLAIN SELECT * FROM t_hint WHERE c1 = 3;
    
    plan_path | 
    ------------------------------------------------------------------------------
    1   SeqScan[(1 1) cost=10,result_num=1](table=T_HINT)|
  • 使用HINT的查询执行计划:
    sql
    SQL> EXPLAIN SELECT /*+index(t_hint i_hint)*/ * FROM t_hint WHERE c1 = 3;
    
    plan_path | 
    ------------------------------------------------------------------------------
    1   BtIdxScan[(1 1) cost=300,result_num=1](table=T_HINT)(index=I_HINT)|
    
    -- 使用表别名
    SQL> EXPLAIN SELECT /*+index(t i_hint)*/ * FROM t_hint t WHERE t.c1 = 3;
    
    plan_path | 
    ------------------------------------------------------------------------------
    1   BtIdxScan[(1 1) cost=300,result_num=1](table=T_HINT)(index=I_HINT)|