Oracle中Hint被忽略的幾種常見情形
Oracle中Hint被忽略的幾種常見情形
作者:hbxztc時間: 2021-02-05 09:26:55【摘要】Hint可以影響優化器對於執行計劃的選擇,但這種影響不是強制性的,優化器在某些情況下可能會忽略目標SQL中的Hint。由於各種原因導致Hint被Oracle忽略後,Oracle並不會給出任何提示或者警告,更不會報錯,目標SQL依然可以正常執行,這也符合Hint實際上是一種特殊註釋的身份。註釋本來就是可有可無的東西,不應該因為它的存在而而導致原先在沒有Hint時可以正常執行的SQL因為加了Hi...
Hint可以影響優化器對於執行計劃的選擇,但這種影響不是強制性的,優化器在某些情況下可能會忽略目標SQL中的Hint。由於各種原因導致Hint被Oracle忽略後,Oracle並不會給出任何提示或者警告,更不會報錯,目標SQL依然可以正常執行,這也符合Hint實際上是一種特殊註釋的身份。註釋本來就是可有可無的東西,不應該因為它的存在而而導致原先在沒有Hint時可以正常執行的SQL因為加了Hint後而變得不能正常執行。
下面來看幾種Hint被Oracle忽略的常見情形。
1 使用的Hint有語法或者拼寫錯誤
一旦使用的Hint中有語法或者拼寫錯誤,Oracle就會忽略該Hint,看幾個示例SQL:
-
select /*+ ind(emp pk_emp) */* from emp;
-
select /*+ index(emp pk_emp */* from emp;
-
select /* + index(emp pk_emp) */* from emp;
-
select */*+ index(emp pk_emp) */ from emp;
-
select /*+ index(scott.emp pk_emp) */* from emp;
-
select /*+ index(emp pk_emp) */* from emp e;
-
select /*+ index(emp emp_pk) */* from emp;
-
select /*+ full(t2) */ t1.ename,t1.deptno from emp t1 where t1.deptno in (select t2.deptno from detp t where t2.loc='CHICAGO');
實際上,上述8條SQL中的Hint都是無效的,它們都會被Oracle忽略。
1是因為關鍵字應該是"index"而不是"ind"
2是因為漏掉了一個右括號
3是因為Hint中第一個*和+之間出現了空格
4是因為Hint出現的位置不對,它應該出現在*前面
5是因為emp表前面帶上了SCHEME名稱
6是因為沒有emp表的別名
7是因為索引名稱寫錯了
8是因為Hint跨了Query Block。Hint生效的範圍公限於它本身所在的Query Block,如果將某個Hint生將範圍擴充套件到它所在的Query Block之外而又沒在該Hint中指定其生效的Query Block名稱的話,Oracle就會忽略該Hint。
2 使用的Hint無效
即使語法是正確的,但如果由於某種原因導致Oracle認為這個Hint無效,則Oracle還是會忽略該Hint。
看幾個例項
scott@TEST>set autotrace traceonly
scott@TEST>select /*+ index(dept idx_dept_loc) */ deptno,dname from dept where loc='CHICAGO';
Execution Plan
----------------------------------------------------------
Plan hash value: 492093765
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 300 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| DEPT | 10 | 300 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_DEPT_LOC | 4 | | 1 (0)| 00:00:01 |
----------------------------------------------------