真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Oracle常見的Hint(二)

一、與表連接方法相關(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)化》


當(dāng)前名稱:Oracle常見的Hint(二)
文章來源:http://weahome.cn/article/gopedp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部