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: 615168685 
  
--------------------------------------------------------------------------- 
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     | 
--------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT   |      |    14 |   518 |     7  (15)| 00:00:01 | 
|*  1 |  HASH JOIN         |      |    14 |   518 |     7  (15)| 00:00:01 | 
|   2 |   TABLE ACCESS FULL| DEPT |     4 |    44 |     3   (0)| 00:00:01 | 
|   3 |   TABLE ACCESS FULL| EMP  |    14 |   364 |     3   (0)| 00:00:01 | 
---------------------------------------------------------------------------
从执行计划中可以看出,仍然走的是HASH JOIN但是index(t2 pk_dept)失效了。因为','是Oracle的保留关键字,所以','后面的index(t2 pk_dept)失效了,再修改Hint如下并执行SQL:
scott@TEST>select /*+ comment 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: 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 | 
----------------------------------------------------------------------------------------
从执行计划中看出,现在走的是跟一开始的执行计划一样,说明Hint中的两个都失效了,因为这两个都在Oracle保留关键字comment后面。再修改Hint如下再次执行SQL:
scott@TEST>select /*+ this 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指定的样子,说明两个都生效了,这是因为this不是Oracle保留关键字。
以上介绍了5种Hint被Oracle忽略的情况,在实例使用过程中一定要注意使用方法,使用正确有效的Hint来提升SQL执行效率,避免Hint被Oracle忽略。

