从上面的执行计划中可以看出,出现了“VIEW”关键字,说明没有做视图合并,表EMP对就的Cardinality为100,连接顺序与前面预想的一致,这说明在禁掉了查询转换后之前被忽略的Ordered Hint又生效了。
5 使用的Hint受到了保留关键字的干扰
Oracle在解析Hint时,是按照从左到右的顺序进行的,如果遇到的词是Oracle的保留关键字,则Oracle将忽略这个词以及之后的所有词;如果遇到词既不是关键字也不是Hint,就忽略该词;如果遇到的词是有效的Hint,那么Oracle就会保留该Hing。
正是由于上述Oracle解析Hint的原则,保留关键字也可能导致相关的Hint失效。
Oracle的���留关键字可以从视图V$RESERVED_WORDS中查到,从下面的查询结果可以看到','、'COMMENT'、'IS'都是保留关键字,但“THIS”不是
scott@TEST>select keyword,length from v$reserved_words where keyword in (',','THIS','IS','COMMENT'); 
  
KEYWORD        LENGTH 
---------- ---------- 
,                   1 
COMMENT             7 
IS                  2
下面来看一个保留关键字导致Hint失效的实例,执行下面的SQL
scott@TEST>select t1.empno,t1.empno,t2.loc from emp t1,dept t2 where t1.deptno=t2.deptno; 
  
14 rows selected. 
  
  
Execution Plan 
---------------------------------------------------------- 
Plan hash value: 844388907 
  
---------------------------------------------------------------------------------------- 
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     | 
---------------------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT             |         |    14 |   518 |     6  (17)| 00:00:01 | 
|   1 |  MERGE JOIN                  |         |    14 |   518 |     6  (17)| 00:00:01 | 
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    44 |     2   (0)| 00:00:01 | 
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 | 
|*  4 |   SORT JOIN                  |         |    14 |   364 |     4  (25)| 00:00:01 | 
|   5 |    TABLE ACCESS FULL         | EMP     |    14 |   364 |     3   (0)| 00:00:01 | 
----------------------------------------------------------------------------------------
从执行计划上看走的是MERGE SORT JOIN,对SQL加入如下Hint并执行:
scott@TEST>select /*+ use_hash(t1) index(t2 pk_dept) */ t1.empno,t1.empno,t2.loc from emp t1,dept t2 where t1.deptno=t2.deptno; 
  
14 rows selected. 
  
  
Execution Plan 
---------------------------------------------------------- 
Plan hash value: 2622742753 
  
---------------------------------------------------------------------------------------- 
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     | 
---------------------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT             |         |    14 |   518 |     6  (17)| 00:00:01 | 
|*  1 |  HASH JOIN                   |         |    14 |   518 |     6  (17)| 00:00:01 | 
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    44 |     2   (0)| 00:00:01 | 
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 | 
|   4 |   TABLE ACCESS FULL          | EMP     |    14 |   364 |     3   (0)| 00:00:01 | 
----------------------------------------------------------------------------------------
从上面的执行计划中可以看出Hint中的两个都生效了,emp做HASH JOIN的被驱动表,对DEPT表做使用索引PK_DEPT。现在对Hint加入',',查看执行情况:

