一、與表連接方法相關(guān)的Hint
海鹽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
1、USE_MERGE
USE_MERGE是針對多個目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個表作為被驅(qū)動表與其他表或結(jié)果集做排序合并連接。在USE_MERGE Hint中指定的目標(biāo)表應(yīng)該是排序合并連接的被驅(qū)動表,如果指定的表并不能作為排序合并連接的被驅(qū)動表,則此時Oracle要么會忽略該Hint,要么會忽略該表。
格式如下:
/*+ USE_MERGE(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ USE_MERGE(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ use_merge(emp) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ use_merge(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
執(zhí)行計劃在表EMP、DEPT、JOBS、EMP_TEMP之間做表連接時全部走的是排序合并連接,這說明USE_MERGE Hint已經(jīng)生效了。Hint中指定的表EMP并不能作為排序合并連接的被驅(qū)動表,但上述Hint中指定的其他三個表DEPT、JOBS、EMP_TEMP是可以作為排序合并連接的被驅(qū)動表的,所以O(shè)racle只是忽略了表EMP,而沒有忽略USE_MERGE Hint。
正是因為Oracle可能會忽略USE_MERGE Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合USE_MERGE Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
select /*+ leading(e) use_merge(j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
2、NO_USE_MERGE
NO_USE_MERGE是針對多個目標(biāo)表的Hint,它是USE_MERGE的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個表作為被驅(qū)動表與其他表或結(jié)果集做排序合并連接。
在NO_USE_MERGE Hint中指定的目標(biāo)表應(yīng)該是原先在排序合并連接中的被驅(qū)動表,否則Oracle要么會忽略該NO_USE_MERGE Hint,要么會忽略該表。正是因為Oracle可能會忽略NO_USE_MERGE Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合NO_USE_MERGE Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
格式如下:
/*+ NO_USE_MERGE(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ NO_USE_MERGE(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ no_use_merge(emp) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ no_use_merge(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
3、USE_NL
USE_NL是針對多個目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個表作為驅(qū)動表與其他表或結(jié)果集做嵌套循環(huán)連接。在USE_NL Hint中指定的目標(biāo)表應(yīng)該是嵌套循環(huán)連接中的被驅(qū)動表,否則Oracle要么會忽略該USE_NL Hint,要么會忽略該表。正是因為Oracle可能會忽略USE_NL Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合USE_NL Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
格式如下:
/*+ USE_NL(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ USE_NL(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ use_nl(dept) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ use_nl(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
USE_NL Hint的用戶和USE_MERGE Hint的用法相同。
4、NO_USE_NL
NO_USE_NL是針對多個目標(biāo)表的Hint,它是USE_NL的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個表連接作為被驅(qū)動表與其他表或結(jié)果集做嵌套循環(huán)連接。在NO_USE_NL Hint中指定的目標(biāo)表應(yīng)該是嵌套循環(huán)連接中的被驅(qū)動表,否則Oracle要么會忽略該NO_USE_NL Hint,要么會忽略該表。正是因為Oracle可能會忽略NO_USE_NL Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合NO_USE_NL Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
格式如下:
/*+ NO_USE_NL(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ NO_USE_NL(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ no_use_nl(dept) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ no_use_nl(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
NO_USE_NL Hint的用戶和NO_USE_MERGE Hint的用法相同。
5、USE_HASH
USE_HASH是針對多個目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個表作為被驅(qū)動表與其他表或結(jié)果集做哈希連接。在USE_HASH Hint中指定的目標(biāo)表應(yīng)該是哈希連接中的被驅(qū)動表,否則Oracle要么會忽略該USE_HASH Hint,要么會忽略該表。正是因為Oracle可能會忽略USE_HASH Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合USE_HASH Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
格式如下:
/*+ USE_HASH(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ USE_HASH(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ use_hash(emp) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ use_hash(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
USE_HASH Hint的用戶和USE_MERGE Hint的用法相同。
6、NO_USE_HASH
NO_USE_HASH是針對多個目標(biāo)表的Hint,它是HASH的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個表作為被驅(qū)動表與其他表或結(jié)果集做哈希連接。在NO_USE_HASH Hint中指定的目標(biāo)表應(yīng)該是哈希連接中的被驅(qū)動表,否則Oracle要么會忽略該NO_USE_HASH Hint,要么會忽略該表。正是因為Oracle可能會忽略NO_USE_HASH Hint或忽略其中指定的被驅(qū)動表,所以我們通常會用LEADING Hint(或ORDERED Hint)配合NO_USE_HASH Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計劃。
格式如下:
/*+ NO_USE_HASH(目標(biāo)表1 目標(biāo)表2 …… 目標(biāo)表n) */
/*+ NO_USE_HASH(目標(biāo)表1,目標(biāo)表2,……,目標(biāo)表n) */
使用范例:
select /*+ no_use_hash(emp) */ *
from emp,dept
where emp.deptno=dept.deptno;
select /*+ no_use_hash(e j d t) */ e.ename,j.job,e.sal,d.deptno
from emp e,jobs j,dept d,emp_temp t
where e.empno=j.empno
and e.deptno=d.deptno
and d.loc='CHICAGO'
and e.ename=t.ename
order by e.ename;
NO_USE_NL Hint的用戶和NO_USE_MERGE Hint的用法相同。
7、MERGE_AJ
MERGE_AJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行排序合并反連接。
格式如下:
/*+ MERGE_AJ */
使用范例:
select *
from emp
where deptno not in (select /*+ merge_aj */deptno
from dept
where loc='CHICAGO');
上述SQL的中Hint的含義是讓優(yōu)化器對目標(biāo)表EMP和DEPT執(zhí)行排序合并反連接。MERGE_AJ是針對子查詢的Hint,所以/*+ merge_aj */的位置在子查詢所在的Query Block中。
還可以寫成
select /*+ merge_aj(@zhaoxu) */ *
from emp
where deptno not in (select /*+ qb_name(zhaoxu) */deptno
from dept
where loc='CHICAGO');
8、NL_AJ
NL_AJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行嵌套循環(huán)反連接。
格式如下:
/*+ NL_AJ */
使用范例:
select *
from emp
where deptno not in (select /*+ nl_aj */deptno
from dept
where loc='CHICAGO');
NL_AJ的用戶與MERGE_AJ Hint的用法相同。
9、HASH_AJ
HASH_AJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行哈希反連接。
格式如下:
/*+ HASH_AJ */
使用范例:
select *
from emp
where deptno not in (select /*+ hash_aj */deptno
from dept
where loc='CHICAGO');
HASH_AJ的用戶與MERGE_AJ Hint的用法相同。
10、MERGE_SJ
MERGE_SJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行排序合并半連接。
格式如下:
/*+ MERGE_SJ */
使用范例:
select *
from dept d
where exists(select /*+ merge_sj */1
from emp e
where e.deptno=d.deptno
and e.sal>800);
MERGE_SJ Hint的用法秘MERGE_AJ Hint的用法相同。
11、NL_SJ
NL_SJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行嵌套循環(huán)半連接。
格式如下:
/*+ NL_SJ */
使用范例:
select *
from dept d
where exists(select /*+ nl_sj */1
from emp e
where e.deptno=d.deptno
and e.sal>800);
NL_SJ Hint的用法秘MERGE_AJ Hint的用法相同。
12、HASH_SJ
HASH_SJ是針對子查詢的Hint,它的含義是讓優(yōu)化器對相關(guān)目標(biāo)表執(zhí)行哈希半連接。
格式如下:
/*+ HASH_SJ */
使用范例:
select *
from dept d
where exists(select /*+ hash_sj */1
from emp e
where e.deptno=d.deptno
and e.sal>800);
HASH_SJ Hint的用法秘MERGE_AJ Hint的用法相同。
二、與并行相關(guān)的Hint
1、PARALLEL
在Oracle 11gR2之前,PARALLEL是針對單個目標(biāo)表的Hint,它的含義是讓優(yōu)化器以指定的或者系統(tǒng)計算出來的并行度去并行訪問目標(biāo)表。從Oracle 11gR2開始,Oracle引入了自動并行,相應(yīng)的,PARALLEL Hint也隨之發(fā)生了變化。
在Oracle 11gR2中,PARALLEL Hint的作用范圍和用法均發(fā)生了變化,Oracle 11gR2中的PARALLEL Hint是針對整個目標(biāo)SQL的Hint,其含義是讓優(yōu)化器以指定的或者系統(tǒng)計算出來的并行度去并行執(zhí)行目標(biāo)SQL的執(zhí)行計劃中所有可以被并行執(zhí)行的執(zhí)行步驟。當(dāng)然,舊的針對單個目標(biāo)表的PARALLEL Hint依然可以在Oracle 11gR2中使用,不過其優(yōu)先級會比新的針對整個目標(biāo)SQL的PARALLEL Hint低,即如果目標(biāo)SQL中同時出現(xiàn)了新舊兩種格式的PARALLEL Hint,Oracle會選擇新的針對整個目標(biāo)SQL的PARALLEL Hint,而忽略舊的針對單個目標(biāo)表的PARALLEL Hint。
新的針對整個目標(biāo)SQL的PARALLEL Hint的格式有如下4種:
格式1 /*+ PARALLEL */
格式2 /*+ PARALLEL(AUTO) */
格式3 /*+ PARALLEL(MANUAL) */
格式4 /*+ PARALLEL(指定的并行度) */
使用了格式1的目標(biāo)SQL總是會以并行的方式執(zhí)行,Oracle此時會計算出一個并行度,這個計算出來的并行度總是大于或等于2。
使用了格式2的目標(biāo)SQL,Oracle會計算出一個并行度,但這個計算出來的并行度可能會是1,所以使用目標(biāo)SQL不一定總是以并行的方式執(zhí)行。
使用了格式3的目標(biāo)SQL,能否并行執(zhí)行完全取決于目標(biāo)SQL中相關(guān)對象的并行度的設(shè)置。舉例來說,如果目標(biāo)表的并行度的設(shè)置大于1時,則目標(biāo)SQL會以并行的方式執(zhí)行,而且并行執(zhí)行的并行度就等于該目標(biāo)表上的并行度設(shè)置。如果目標(biāo)表并行度為1,則會以串行方式執(zhí)行。
使用了格式4的目標(biāo)SQL總是會以該Hint中指定的并行度去執(zhí)行目標(biāo)SQL。
舊的針對單個目標(biāo)表的PARALLEL Hint的格式有如下2種:
格式1 /*+ PARALLEL(目標(biāo)表 指定的并行度) */或/*+ PARALLEL(目標(biāo)表,指定的并行度) */
格式2 /*+ PARALLEL(目標(biāo)表 DEFAULT) */或/*+ PARALLEL(目標(biāo)表,DEFAULT) */
使用了格式1的目標(biāo)SQL總是會以該Hint中指定的并行度去訪問目標(biāo)表。
使用了格式2的目標(biāo)SQL總是會根據(jù)相關(guān)系統(tǒng)參數(shù)計算出來的默認(rèn)并行度去并行訪問目標(biāo)表。
針對整個目標(biāo)SQL的PARALLEL Hint的使用范例:
select /*+ parallel */ ename from emp;
select /*+ parallel(auto) */ ename from emp;
select /*+ parallel(manual) */ ename from emp;
select /*+ parallel(6) */ ename from emp;
針對單個目標(biāo)表的PARALLEL Hint的使用范例:
select /*+ parallel(emp 2) */ ename from emp;
select /*+ parallel(emp default) */ ename from emp;
可以從V$PQ_SLAVE中查看當(dāng)前系統(tǒng)并行執(zhí)行所使用的并行子進(jìn)程的詳情,視圖中的SESSIONS字段表示使用并行子進(jìn)程的session的總數(shù),即使是同一個session,如果它多次使用一個并行子進(jìn)程,則該并行子進(jìn)程在視圖中對應(yīng)記錄的字段SESSIONS的值也會遞增。在特定的情況下,通過這個字段我可分析出目標(biāo)SQL在執(zhí)行的的實際并行度。
在Oracle 11gR2中并行Hint也可用于全局臨時表。
2、NO_PARALLEL
在Oracle 11gR2中,和PARALLEL Hint一樣,NO_PARALLEL Hint的作用范圍和用法均發(fā)生了變化,Oracle 11gR2中的NO_PARALLEL是針對整個目標(biāo)構(gòu)圖的Hint,它是PARALLEL Hint的反義Hint,其含義是不讓優(yōu)化器并行執(zhí)行目標(biāo)SQL的執(zhí)行計劃中所可以被并行執(zhí)行的執(zhí)行步驟。當(dāng)然,舊的針對單個目標(biāo)表的NO_PARALLEL Hint依然可以在Oracle 11gR2中使用。
新的針對整個目標(biāo)SQL的NO_PARALLEL格式如下:
/*+ NO_PARALLEL */
舊的針對單個目標(biāo)表的NO_PARALLEL格式如下
/*+ NO_PARALLEL(目標(biāo)表) */
針對整個目標(biāo)SQL的NO_PARALLEL使用范例:
select /*+ no_parallel */ * from emp;
針對單個目標(biāo)表的NO_PARALLEL使用范例:
select /*+ no_parallel(emp) */ * from emp;
3、PARALLEL_INDEX
PARALLEL_INDEX是針對單個目標(biāo)表的Hint,它的含義是讓優(yōu)化器以指定的或者系統(tǒng)計算出來的并行度去對目標(biāo)表上的目標(biāo)分區(qū)索引執(zhí)行并行索引掃描操作。
使用格式有如下5種:
格式1 /*+ PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引 指定的并行度) */
格式2 /*+ PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引 DEFAULT) */
格式3 /*+ PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引1 目標(biāo)分區(qū)索引2 …… 目標(biāo)分區(qū)索引n 目標(biāo)分區(qū)索引1的并行度 目標(biāo)分區(qū)索引2的并行度 …… 目標(biāo)分區(qū)索引n的并行度) */
格式4 /*+ PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引1 目標(biāo)分區(qū)索引2 …… 目標(biāo)分區(qū)索引n DEFAULT DEFAULT …… DEFAULT) */
格式5 /*+ PARALLEL_INDEX(目標(biāo)表) */
使用了格式1的目標(biāo)SQL總是會以格式1中指定的并行度去并行訪問該目標(biāo)表上的目標(biāo)分區(qū)索引
使用了格式2的目標(biāo)SQL總是會以根據(jù)相關(guān)系統(tǒng)參數(shù)計算出來的默認(rèn)并行度去并行訪問該目標(biāo)表上的目標(biāo)分區(qū)索引。這里優(yōu)化器可能會對計算出來的默認(rèn)并行度做一定的調(diào)整,即使用了格式2的目標(biāo)SQL的實際并行度不一定就是當(dāng)前系統(tǒng)的默認(rèn)并行度。
可以在PARALLEL_INDEX Hint中指定多個目標(biāo)索引,并分別指定它們各自對應(yīng)的并行度(格式3)或?qū)⑺鼈兊母髯詫?yīng)的并行度統(tǒng)一指定為Oracle計算出來的默認(rèn)值(格式4)或只指定目標(biāo)表(格式5,表示同時指定了該目標(biāo)表上所有已存在的索引),此時Oracle會分別計算對它們各自做并行掃描的成本,并從中選擇一個成本值最低的作為待并行掃描的目標(biāo)索引。
Hint中的分隔符也可以用","。
使用范例:
select /*+ parallel_index(emp_par idx_par 3) */ emp from emp_par;
select /*+ parallel_index(emp_par idx_par default) */ emp from emp_par;
select /*+ index(emp_par idx_par_1) parallel_index(emp_par idx_par_1 idx_par_2 3 3) */ emp from emp_par;
4、NO_PARALLEL_INDEX
NO_PARALLEL_INDEX是針對單個目標(biāo)表的Hint,它是PARALLEL_INDEX Hint的反義Hint,其含義是不讓優(yōu)化器對Hint指定的位于目標(biāo)表上的目標(biāo)分區(qū)索引執(zhí)行并行索引掃描操作。
格式如下:
格式1 /*+ NO_PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引) */
格式2 /*+ NO_PARALLEL_INDEX(目標(biāo)表 目標(biāo)分區(qū)索引1 目標(biāo)分區(qū)索引2 …… 目標(biāo)分區(qū)索引n) */
格式3 /*+ NO_PARALLEL_INDEX(目標(biāo)表) */
分隔符也可以用","。
使用范例:
select /*+ no_parallel_index(emp_par idx_par) */ empno from emp_par;
select /*+ no_parallel_index(emp_par idx_par1 idx_par_2) */ empno from emp_par;
select /*+ no_parallel_index(emp_par) */ empno from emp_par;
三、與查詢轉(zhuǎn)換相關(guān)的Hint
1、USE_CONCAT
USE_CONCAT是針對整個目標(biāo)SQL的Hint,它的含義是讓優(yōu)化器對目標(biāo)SQL使用IN-List擴(kuò)展(IN-List Expansion)或OR擴(kuò)展(OR Expansion)。
格式如下:
/*+ USE_CONCAT */
使用范例:
select /*+ use_concat */ emp,ename from emp where empno in (7654,7698);
select /*+ use_concat */ * from emp where mgr=7902 and deptno=20;
執(zhí)行計劃中對應(yīng)的關(guān)鍵字是“CONCATENATION”。
2、NO_EXPAND
NO_EXPAND是針對整個目標(biāo)SQL的Hint,它是USE_CONCAT的反義Hint,其含義是不讓優(yōu)化器對目標(biāo)SQL使用IN-List擴(kuò)展或OR擴(kuò)展。
格式如下:
/*+ NO_EXPAND */
使用范例:
select /*+ no_expand */ emp,ename from emp where empno in (7654,7698);
select /*+ no_expand */ * from emp where mgr=7902 and deptno=20;
執(zhí)行計劃中不出現(xiàn)關(guān)鍵字是“CONCATENATION”。
3、MERGE
MERGE是針對單個目標(biāo)視圖的Hint,它的含義是讓優(yōu)化器對目標(biāo)視圖執(zhí)行視圖合并(View Mergeing)。
使用格式:
/*+ MERGE(目標(biāo)視圖) */
如果目標(biāo)視圖是一個內(nèi)嵌視圖,則MERGE Hint也可以出現(xiàn)在其視圖定義語句所在的Query Block中,只是此時Hint中就不應(yīng)該再帶上該內(nèi)嵌視圖的名稱,其格式應(yīng)為/*+ MERGE */
使用范例:
select /*+ merge(dept_view) */ empno,ename,dname
from emp,dept_view
where emp.deptno=dept_view.deptno;
select empno,ename,dname
from emp,
(select /*+ merge */*
from dept
where local='CHICAGO') dept_view_inline
where emp.deptno=dept_view_inline.deptno;
4、NO_MERGE
NO_MERGE是針對單個目標(biāo)視圖的Hint,它是MERGE的反義Hint,其含義是不上優(yōu)化器對目標(biāo)視圖執(zhí)行視圖合并。
格式如下:
/*+ NO_MERGE(目標(biāo)視圖) */
如果目標(biāo)視圖是一個內(nèi)嵌視圖,則MERGE Hint也可以出現(xiàn)在其視圖定義語句所在的Query Block中,只是此時Hint中就不應(yīng)該再帶上該內(nèi)嵌視圖的名稱,其格式應(yīng)為/*+ NO_MERGE */
使用范例:
select /*+ no_merge(dept_view) */ empno,ename,dname
from emp,dept_view
where emp.deptno=dept_view.deptno;
select empno,ename,dname
from emp,
(select /*+ no_merge */*
from dept
where local='CHICAGO') dept_view_inline
where emp.deptno=dept_view_inline.deptno;
5、UNNEST
UNNEST是針對子查詢的Hinit,它的含義是讓優(yōu)化器對目標(biāo)SQL的子查詢執(zhí)行子查詢展開(Subquery Unnesting)。
格式如下:
/*+ UNNEST */
使用范例:
select *
from emp
where deptno not in (select /*+ unnest */ deptno
from dept
where loc='CHICAGO');
/*+ unnest */的位置應(yīng)位于子查詢所在的Query Block中。
6、NO_UNNEST
NO_UNNEST是針對子查詢的Hint,它是UNNEST的反義Hint,其含義是不讓優(yōu)化器對目標(biāo)SQL中的子查詢使用子查詢展開。
格式如下:
/*+ NO_UNNEST */
使用范例:
select *
from emp
where deptno not in (select /*+ no_unnest */ deptno
from dept
where loc='CHICAGO');
/*+ no_unnest */的位置在子查詢所在的Query Block中。
7、EXPAND_TABLE
EXPAND_TABLE是針對單個目標(biāo)表的Hint,它的含義是讓優(yōu)化器在不考慮成本的情況下,對目標(biāo)表SQL中的目標(biāo)表執(zhí)行表擴(kuò)展。
格式如下:
/*+ EXPAND_TABLE(目標(biāo)表) */
使用范例:
select /*+ expand_table(t1) */ t2.cust_city,sum(t1.amount_sold) amount_sold_total
from sales t1,customers t2,products t3,channels t4
where t1.cust_id=t2.cust_id
and t1.prod_id=t3.prod_id
and t1.channel_id=t4.channel_id
and t2.country_id=52771
and t3.prod_name='Mouse Pad'
and t4.channel_desc='Internet'
and time_id between to_date('2000-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS') and to_date('2004-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS');
8、NO_EXPAND_TABLE
NO_EXPAND_TABLE是針對單個目標(biāo)表的Hint,它是EXPAND_TABLE的反義Hint,其含義是不讓優(yōu)化器對目標(biāo)SQL中的目標(biāo)表使用表擴(kuò)展。。
格式如下:
/*+ NO_EXPAND_TABLE(目標(biāo)表) */
使用范例:
select /*+ no_expand_table(t1) */ t2.cust_city,sum(t1.amount_sold) amount_sold_total
from sales t1,customers t2,products t3,channels t4
where t1.cust_id=t2.cust_id
and t1.prod_id=t3.prod_id
and t1.channel_id=t4.channel_id
and t2.country_id=52771
and t3.prod_name='Mouse Pad'
and t4.channel_desc='Internet'
and time_id between to_date('2000-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS') and to_date('2004-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS');
參考《基于Oracle的SQL優(yōu)化》