欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Oracle常見的Hint(二)

一、與表連接方法相關(guān)的Hint

海鹽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

1、USE_MERGE

USE_MERGE是針對(duì)多個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個(gè)表作為被驅(qū)動(dòng)表與其他表或結(jié)果集做排序合并連接。在USE_MERGE Hint中指定的目標(biāo)表應(yīng)該是排序合并連接的被驅(qū)動(dòng)表,如果指定的表并不能作為排序合并連接的被驅(qū)動(dòng)表,則此時(shí)Oracle要么會(huì)忽略該Hint,要么會(huì)忽略該表。

格式如下:

/*+ 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í)行計(jì)劃在表EMP、DEPT、JOBS、EMP_TEMP之間做表連接時(shí)全部走的是排序合并連接,這說明USE_MERGE Hint已經(jīng)生效了。Hint中指定的表EMP并不能作為排序合并連接的被驅(qū)動(dòng)表,但上述Hint中指定的其他三個(gè)表DEPT、JOBS、EMP_TEMP是可以作為排序合并連接的被驅(qū)動(dòng)表的,所以O(shè)racle只是忽略了表EMP,而沒有忽略USE_MERGE Hint。

正是因?yàn)镺racle可能會(huì)忽略USE_MERGE Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合USE_MERGE Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

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是針對(duì)多個(gè)目標(biāo)表的Hint,它是USE_MERGE的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個(gè)表作為被驅(qū)動(dòng)表與其他表或結(jié)果集做排序合并連接。

在NO_USE_MERGE Hint中指定的目標(biāo)表應(yīng)該是原先在排序合并連接中的被驅(qū)動(dòng)表,否則Oracle要么會(huì)忽略該NO_USE_MERGE Hint,要么會(huì)忽略該表。正是因?yàn)镺racle可能會(huì)忽略NO_USE_MERGE Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合NO_USE_MERGE Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

格式如下:

/*+ 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是針對(duì)多個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個(gè)表作為驅(qū)動(dòng)表與其他表或結(jié)果集做嵌套循環(huán)連接。在USE_NL Hint中指定的目標(biāo)表應(yīng)該是嵌套循環(huán)連接中的被驅(qū)動(dòng)表,否則Oracle要么會(huì)忽略該USE_NL Hint,要么會(huì)忽略該表。正是因?yàn)镺racle可能會(huì)忽略USE_NL Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合USE_NL Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

格式如下:

/*+ 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是針對(duì)多個(gè)目標(biāo)表的Hint,它是USE_NL的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個(gè)表連接作為被驅(qū)動(dòng)表與其他表或結(jié)果集做嵌套循環(huán)連接。在NO_USE_NL Hint中指定的目標(biāo)表應(yīng)該是嵌套循環(huán)連接中的被驅(qū)動(dòng)表,否則Oracle要么會(huì)忽略該NO_USE_NL Hint,要么會(huì)忽略該表。正是因?yàn)镺racle可能會(huì)忽略NO_USE_NL Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合NO_USE_NL Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

格式如下:

/*+ 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是針對(duì)多個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器將我們指定的多個(gè)表作為被驅(qū)動(dòng)表與其他表或結(jié)果集做哈希連接。在USE_HASH Hint中指定的目標(biāo)表應(yīng)該是哈希連接中的被驅(qū)動(dòng)表,否則Oracle要么會(huì)忽略該USE_HASH Hint,要么會(huì)忽略該表。正是因?yàn)镺racle可能會(huì)忽略USE_HASH Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合USE_HASH Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

格式如下:

/*+ 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是針對(duì)多個(gè)目標(biāo)表的Hint,它是HASH的反義Hint,其含義是不讓優(yōu)化器將我們指定的多個(gè)表作為被驅(qū)動(dòng)表與其他表或結(jié)果集做哈希連接。在NO_USE_HASH Hint中指定的目標(biāo)表應(yīng)該是哈希連接中的被驅(qū)動(dòng)表,否則Oracle要么會(huì)忽略該NO_USE_HASH Hint,要么會(huì)忽略該表。正是因?yàn)镺racle可能會(huì)忽略NO_USE_HASH Hint或忽略其中指定的被驅(qū)動(dòng)表,所以我們通常會(huì)用LEADING Hint(或ORDERED Hint)配合NO_USE_HASH Hint使用,以讓優(yōu)化器走出我們想要的執(zhí)行計(jì)劃。

格式如下:

/*+ 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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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)化器對(duì)目標(biāo)表EMP和DEPT執(zhí)行排序合并反連接。MERGE_AJ是針對(duì)子查詢的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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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是針對(duì)子查詢的Hint,它的含義是讓優(yōu)化器對(duì)相關(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是針對(duì)單個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器以指定的或者系統(tǒng)計(jì)算出來的并行度去并行訪問目標(biāo)表。從Oracle 11gR2開始,Oracle引入了自動(dòng)并行,相應(yīng)的,PARALLEL Hint也隨之發(fā)生了變化。

在Oracle 11gR2中,PARALLEL Hint的作用范圍和用法均發(fā)生了變化,Oracle 11gR2中的PARALLEL Hint是針對(duì)整個(gè)目標(biāo)SQL的Hint,其含義是讓優(yōu)化器以指定的或者系統(tǒng)計(jì)算出來的并行度去并行執(zhí)行目標(biāo)SQL的執(zhí)行計(jì)劃中所有可以被并行執(zhí)行的執(zhí)行步驟。當(dāng)然,舊的針對(duì)單個(gè)目標(biāo)表的PARALLEL Hint依然可以在Oracle 11gR2中使用,不過其優(yōu)先級(jí)會(huì)比新的針對(duì)整個(gè)目標(biāo)SQL的PARALLEL Hint低,即如果目標(biāo)SQL中同時(shí)出現(xiàn)了新舊兩種格式的PARALLEL Hint,Oracle會(huì)選擇新的針對(duì)整個(gè)目標(biāo)SQL的PARALLEL Hint,而忽略舊的針對(duì)單個(gè)目標(biāo)表的PARALLEL Hint。

新的針對(duì)整個(gè)目標(biāo)SQL的PARALLEL Hint的格式有如下4種:

格式1 /*+ PARALLEL */

格式2 /*+ PARALLEL(AUTO) */

格式3 /*+ PARALLEL(MANUAL) */

格式4 /*+ PARALLEL(指定的并行度) */

使用了格式1的目標(biāo)SQL總是會(huì)以并行的方式執(zhí)行,Oracle此時(shí)會(huì)計(jì)算出一個(gè)并行度,這個(gè)計(jì)算出來的并行度總是大于或等于2。

使用了格式2的目標(biāo)SQL,Oracle會(huì)計(jì)算出一個(gè)并行度,但這個(gè)計(jì)算出來的并行度可能會(huì)是1,所以使用目標(biāo)SQL不一定總是以并行的方式執(zhí)行。

使用了格式3的目標(biāo)SQL,能否并行執(zhí)行完全取決于目標(biāo)SQL中相關(guān)對(duì)象的并行度的設(shè)置。舉例來說,如果目標(biāo)表的并行度的設(shè)置大于1時(shí),則目標(biāo)SQL會(huì)以并行的方式執(zhí)行,而且并行執(zhí)行的并行度就等于該目標(biāo)表上的并行度設(shè)置。如果目標(biāo)表并行度為1,則會(huì)以串行方式執(zhí)行。

使用了格式4的目標(biāo)SQL總是會(huì)以該Hint中指定的并行度去執(zhí)行目標(biāo)SQL。

舊的針對(duì)單個(gè)目標(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總是會(huì)以該Hint中指定的并行度去訪問目標(biāo)表。

使用了格式2的目標(biāo)SQL總是會(huì)根據(jù)相關(guān)系統(tǒng)參數(shù)計(jì)算出來的默認(rèn)并行度去并行訪問目標(biāo)表。

針對(duì)整個(gè)目標(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;

針對(duì)單個(gè)目標(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ù),即使是同一個(gè)session,如果它多次使用一個(gè)并行子進(jìn)程,則該并行子進(jìn)程在視圖中對(duì)應(yīng)記錄的字段SESSIONS的值也會(huì)遞增。在特定的情況下,通過這個(gè)字段我可分析出目標(biāo)SQL在執(zhí)行的的實(shí)際并行度。

在Oracle 11gR2中并行Hint也可用于全局臨時(shí)表。

2、NO_PARALLEL

在Oracle 11gR2中,和PARALLEL Hint一樣,NO_PARALLEL Hint的作用范圍和用法均發(fā)生了變化,Oracle 11gR2中的NO_PARALLEL是針對(duì)整個(gè)目標(biāo)構(gòu)圖的Hint,它是PARALLEL Hint的反義Hint,其含義是不讓優(yōu)化器并行執(zhí)行目標(biāo)SQL的執(zhí)行計(jì)劃中所可以被并行執(zhí)行的執(zhí)行步驟。當(dāng)然,舊的針對(duì)單個(gè)目標(biāo)表的NO_PARALLEL Hint依然可以在Oracle 11gR2中使用。

新的針對(duì)整個(gè)目標(biāo)SQL的NO_PARALLEL格式如下:

/*+ NO_PARALLEL */

舊的針對(duì)單個(gè)目標(biāo)表的NO_PARALLEL格式如下

/*+ NO_PARALLEL(目標(biāo)表) */

針對(duì)整個(gè)目標(biāo)SQL的NO_PARALLEL使用范例:

select /*+ no_parallel */ * from emp;

針對(duì)單個(gè)目標(biāo)表的NO_PARALLEL使用范例:

select /*+ no_parallel(emp) */ * from emp;

3、PARALLEL_INDEX

PARALLEL_INDEX是針對(duì)單個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器以指定的或者系統(tǒng)計(jì)算出來的并行度去對(duì)目標(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總是會(huì)以格式1中指定的并行度去并行訪問該目標(biāo)表上的目標(biāo)分區(qū)索引

使用了格式2的目標(biāo)SQL總是會(huì)以根據(jù)相關(guān)系統(tǒng)參數(shù)計(jì)算出來的默認(rèn)并行度去并行訪問該目標(biāo)表上的目標(biāo)分區(qū)索引。這里優(yōu)化器可能會(huì)對(duì)計(jì)算出來的默認(rèn)并行度做一定的調(diào)整,即使用了格式2的目標(biāo)SQL的實(shí)際并行度不一定就是當(dāng)前系統(tǒng)的默認(rèn)并行度。

可以在PARALLEL_INDEX Hint中指定多個(gè)目標(biāo)索引,并分別指定它們各自對(duì)應(yīng)的并行度(格式3)或?qū)⑺鼈兊母髯詫?duì)應(yīng)的并行度統(tǒng)一指定為Oracle計(jì)算出來的默認(rèn)值(格式4)或只指定目標(biāo)表(格式5,表示同時(shí)指定了該目標(biāo)表上所有已存在的索引),此時(shí)Oracle會(huì)分別計(jì)算對(duì)它們各自做并行掃描的成本,并從中選擇一個(gè)成本值最低的作為待并行掃描的目標(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是針對(duì)單個(gè)目標(biāo)表的Hint,它是PARALLEL_INDEX Hint的反義Hint,其含義是不讓優(yōu)化器對(duì)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是針對(duì)整個(gè)目標(biāo)SQL的Hint,它的含義是讓優(yōu)化器對(duì)目標(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í)行計(jì)劃中對(duì)應(yīng)的關(guān)鍵字是“CONCATENATION”。

2、NO_EXPAND

NO_EXPAND是針對(duì)整個(gè)目標(biāo)SQL的Hint,它是USE_CONCAT的反義Hint,其含義是不讓優(yōu)化器對(duì)目標(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í)行計(jì)劃中不出現(xiàn)關(guān)鍵字是“CONCATENATION”。

3、MERGE

MERGE是針對(duì)單個(gè)目標(biāo)視圖的Hint,它的含義是讓優(yōu)化器對(duì)目標(biāo)視圖執(zhí)行視圖合并(View Mergeing)。

使用格式:

/*+ MERGE(目標(biāo)視圖) */

如果目標(biāo)視圖是一個(gè)內(nèi)嵌視圖,則MERGE Hint也可以出現(xiàn)在其視圖定義語句所在的Query Block中,只是此時(shí)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是針對(duì)單個(gè)目標(biāo)視圖的Hint,它是MERGE的反義Hint,其含義是不上優(yōu)化器對(duì)目標(biāo)視圖執(zhí)行視圖合并。

格式如下:

/*+ NO_MERGE(目標(biāo)視圖) */

如果目標(biāo)視圖是一個(gè)內(nèi)嵌視圖,則MERGE Hint也可以出現(xiàn)在其視圖定義語句所在的Query Block中,只是此時(shí)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是針對(duì)子查詢的Hinit,它的含義是讓優(yōu)化器對(duì)目標(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是針對(duì)子查詢的Hint,它是UNNEST的反義Hint,其含義是不讓優(yōu)化器對(duì)目標(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是針對(duì)單個(gè)目標(biāo)表的Hint,它的含義是讓優(yōu)化器在不考慮成本的情況下,對(duì)目標(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是針對(duì)單個(gè)目標(biāo)表的Hint,它是EXPAND_TABLE的反義Hint,其含義是不讓優(yōu)化器對(duì)目標(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)化》

本文標(biāo)題:Oracle常見的Hint(二)
文章來源:http://aaarwkj.com/article18/gopedp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、微信公眾號(hào)、搜索引擎優(yōu)化虛擬主機(jī)、用戶體驗(yàn)手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
avav男人天堂亚洲天堂| 久久婷婷av一区二区三区| 国产亚洲精品视频在线| 日本精品av一区二区| 亚洲精品国产第一区第二区| 色婷婷激一区二区三区| 日韩欧美黄片一区二区三区| 欧美成人极品一区二区三区| 亚洲综合一区二区三区不卡| 中文字幕日韩欧美一区二区| 日本熟妇一区二区三区在线视频 | 欧美国产日本日韩在线黄| 国产视频专区一区二区| 日韩精品在线观看天堂| 日本国产一区二区三区在线| 无遮挡动漫网站免费观看| 久久精品一区二区熟女| 亚洲熟妇av一区二区三区| 日韩高清亚洲一区二区| 九九热九九热九九热九| 91麻豆精品国产91久| 日本成人一区二区在线播放| 精品国产欧美成人一区| 国产剧免费看视频网站成人| 日本区一区二区三高清视频| 国产高清内射一级一片高清视频| 国产在线第一页第二页| 亚洲精品aa片在线观看国产| 免费黄片视频大全在线播放| 成年网站在线91九色| 91欧美精品一区二区| 男人av天堂手机在线| 久久久国产一区二区三区| 久久成人免费在线电影| 蜜臀av一区二区三区人妻| 久久久久国产综合精品| 日韩中文字幕资源一区| 国产亚洲中文久久网久久| 人人妻人人澡人人爽的视频| 中文字幕一区日韩欧美| 亚洲国产欧美在线人成人|