SELECT /*+ HINT1 [HINT2]*/ 列名 FROM 表名 WHERE_CLAUSE ;
UPDATE 表名 /*+ HINT1 [HINT2]*/ SET 列名 =变量 WHERE_CLAUSE ;
DELETE FROM 表名 /*+ HINT1 [HINT2]*/ WHERE_CLAUSE ;
SELECT * FROM V$HINT_INI_INFO;
SELECT /*+ENABLE_HASH_JOIN(1)*/ * FROM T1,T2 WHERE C1=D1;
/*+ INDEX (表名[,] 索引名) {INDEX (表名[,] 索引名)} */
SELECT /*+INDEX(T1, IDX_T1_ID) */ * FROM T1 WHERE ID > 2011 AND NAME < 'XXX';
SELECT * FROM T1 INDEX IDX_T1_ID WHERE ID > 2011 AND NAME < 'XXX';
不使用索引
/*+ NO_INDEX (表名[,] 索引名) { NO_INDEX (表名[,] 索引名)} */
EXPLAIN SELECT /*+ USE_HASH(T1, T2) */ * FROM T1, T2 WHERE T1.ID = T2.ID;
EXPLAIN SELECT /*+ NO_USE_HASH(T1, T2) */ * FROM T1, T2 WHERE T1.ID = T2.ID;
EXPLAIN SELECT /*+ USE_NL(A, B) */ * FROM T1 A, T2 B WHERE A.ID = B.ID;
#NEST LOOP INNER JOIN2
EXPLAIN SELECT /*+ NO_USE_NL(A, B) */ * FROM T1 A, T2 B WHERE A.ID = B.ID;
EXPLAIN SELECT /*+ USE_NL_WITH_INDEX(T1, IDX_T2_ID) */ * FROM T1, T2 WHERE T1.ID = T2.ID;
#NEST LOOP IN DEX JOIN2:
EXPLAIN SELECT /*+ NO_USE_NL_WITH_INDEX(T1, IDX_T2_ID) */ * FROM T1, T2 WHERE T1.ID = T2.ID;
/*+ USE_MERGE(T1,T2) */
#MERGE INNER JOIN3
/*+ NO_USE_MERGE(T1,T2) */
/*+ SEMI_GEN_CROSS OPTIMIZER_MODE(1) */
/*+ NO_SEMI_GEN_CROSS OPTIMIZER_MODE(1) */
/*+ USE_CVT_VAR OPTIMIZER_MODE(1) */
/*+ NO_USE_CVT_VAR OPTIMIZER_MODE(1) */
/*+ stat(T1 1M) stat(T2 1M) */
/*+ENHANCED_MERGE_JOIN OPTIMIZER_MODE(1) stat(T1 1M) stat(T2 1M)*/
/*+ ORDER (T1, T2 , T3, … tn ) */
举例
SELECT /*+ ORDER(T1, T2, T3 )*/* FROM T1, T2 , T3, T4 WHERE …
在指定上述连接顺序后,T4,T1,T2,T3 或 T1,T2,T4,T3 会被考虑;T3,T1,T2 或 T1,T3,T2 不被考虑。
连接顺序也可以和连接方法同时指定用于得到更特定的执行计划
/*+ OPTIMIZER_MODE(1), ORDER(T1,T2,T3,T4) ,USE_HASH(T1,T2), USE_HASH(T2,T3),USE_HASH(T3,T4)*/
/*+ STAT (表名, 行数) */
/*+LOCAL_OBJECT(对象名/别名)*/
/*+local_object(t1)*/
当执行 INSERT 操作时,如果存在 UNIQUE 索引,那么发生了重复键值冲突。使用 HINTIGNORE_ROW_ON_DUPKEY_INDEX 则可以忽略该冲突,冲突数据既不进行插入也不会报错,其他非冲突插入正常进行。
每一个该 HINT 仅对应一个索引,如需忽略多个索引上的重复键值冲突,请指定多个HINT。
/*+IGNORE_ROW_ON_DUPKEY_INDEX(<表名>[(<列名>{,<列名>})])*/
若 INSERT 的目标表具有别名,则只有<表名>与别名一致时 HINT 才生效。
支持使用该 HINT 时不指定<列名>,此时忽略表上除函数索引外的所有 UNIQUE 索引的报错。当指定<列名>时,该 HINT 指定的<列名>必须是某个 UNIQUE 索引的前导列或者全部列,否则报错;当作为前导列时,不能出现其它也将这些列作为前导列的 UNIQUE 索引,否则报错。指定该 HINT 时,不支持 insert 操作的批量优化处理。
/*+IGNORE_ROW_ON_DUPKEY_INDEX(t1(c1,c2,c3))*/
/*+IGNORE_ROW_ON_DUPKEY_INDEX(t1)*/
使用 HINT PLAN_NO_CACHE 禁用计划缓存,当前语句的执行计划将不会被缓存
/*+PLAN_NO_CACHE*/
/*+ PARALLEL([<表名>] <并行任务个数>) */
例 下面的例子中,即使已经设置了 MAX_PARALLEL_DEGREE 默认值 3,但实际使用为 PARALLEL 指定的任务个数 4
SELECT /*+ PARALLEL(4) */ * FROM SYSOBJECTS;
SELECT /*+ PARALLEL(SYSOBJECTS 4) */ * FROM SYSOBJECTS;
SELECT /*+ PARALLEL(1) *//*+ PARALLEL(2) */ * FROM SYSOBJECTS;
这种方式能够为单条查询语句设置额外的并行任务个数,以此来提高某些特殊查询任务的性能
大型表的连接查询、大量数据的聚合和大型结果集的排序等都很适合采用并行查询
select /*+ RESULT_CACHE */ id, name from sysobjects;
select /*+ NO_RESULT_CACHE */ id, name from sysobjects;
文章
阅读量
获赞
