<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • Oracle10g常見HINT的用法

    時(shí)間:2024-09-02 06:08:04 Oracle認(rèn)證 我要投稿
    • 相關(guān)推薦

    關(guān)于Oracle10g常見HINT的用法

      Oracle10g關(guān)于HINT的用法很多,下面小編為大家整理了Oracle10g常見HINT的用法,希望能為你提供幫助:

      語法:

      提示里不區(qū)分大小寫, 多個提示用空格分開, 如:select /*+ hint1(tab1) hint2(TAB1 idx1) */ col1, col2 from tab1 where col1='xxx';

      如果表使用了別名, 那么提示里也必須使用別名, 如:select /*+ hint1(t1) */ col1, col2 from tab1 t1 where col1='xxx';

      在SQL優(yōu)化過程中常見HINT的用法(前10個比較常用, 前3個最常用):

      1. /*+ INDEX */ 和 /*+ INDEX(TABLE INDEX1, index2) */ 和 /*+ INDEX(tab1.col1 tab2.col2) */ 和 /*+ NO_INDEX */ 和 /*+ NO_INDEX(TABLE INDEX1, index2) */

      表明對表選擇索引的掃描方法. 第一種不指定索引名是讓Oracle對表中可用索引比較并選擇某個最佳索引; 第二種是指定索引名且可指定多個索引; 第三種是10g開始有的, 指定列名, 且表名可不用別名; 第四種即全表掃描; 第五種表示禁用某個索引, 特別適合于準(zhǔn)備刪除某個索引前的評估操作. 如果同時(shí)使用了INDEX和NO_INDEX則兩個提示都會被忽略掉.

      例如:SELECT /*+ INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';

      2. /*+ ORDERED */

      FROM子句中默認(rèn)最后一個表是驅(qū)動表,ORDERED將from子句中第一個表作為驅(qū)動表. 特別適合于多表連接非常慢時(shí)嘗試.

      例如:SELECT /*+ ORDERED */ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

      3. /*+ PARALLEL(table1,DEGREE) */ 和 /*+ NO_PARALLEL(table1) */

      該提示會將需要執(zhí)行全表掃描的查詢分成多個部分(并行度)執(zhí)行, 然后在不同的操作系統(tǒng)進(jìn)程中處理每個部分. 該提示還可用于DML語句. 如果SQL里還有排序操作, 進(jìn)程數(shù)會翻倍,此外還有一個一個負(fù)責(zé)組合這些部分的進(jìn)程,如下面的例子會產(chǎn)生9個進(jìn)程. 如果在提示中沒有指定DEGREE, 那么就會使用創(chuàng)建表時(shí)的默認(rèn)值. 該提示在默認(rèn)情況下會使用APPEND提示. NO_PARALLEL是禁止并行操作,否則語句會使用由于定義了并行對象而產(chǎn)生的并行處理.

      例如:select /*+ PARALLEL(tab_test,4) */ col1, col2 from tab_test order by col2;

      4. /*+ FIRST_ROWS */ 和 /*+ FIRST_ROWS(n) */

      表示用最快速度獲得第1/n行, 獲得最佳響應(yīng)時(shí)間, 使資源消耗最小化.

      在update和delete語句里會被忽略, 使用分組語句如group by/distinct/intersect/minus/union時(shí)也會被忽略.

      例如:SELECT /*+ FIRST_ROWS */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

      5. /*+ RULE */

      表明對語句塊選擇基于規(guī)則的優(yōu)化方法.

      例如:SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

      6. /*+ FULL(TABLE) */

      表明對表選擇全局掃描的方法.

      例如:SELECT /*+ FULL(A) */ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

      7. /*+ LEADING(TABLE) */

      類似于ORDERED提示, 將指定的表作為連接次序中的驅(qū)動表.

      8. /*+ USE_NL(TABLE1,TABLE2) */

      將指定表與嵌套的連接的行源進(jìn)行連接,以最快速度返回第一行再連接,與USE_MERGE剛好相反.

      例如:SELECT /*+ ORDERED USE_NL(BSEMPMS) */ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

      9. /*+ APPEND */ 和 /*+ NOAPPEND */

      直接插入到表的最后,該提示不會檢查當(dāng)前是否有插入操作所需的塊空間而是直接添加到新塊中, 所以可以提高速度. 當(dāng)然也會浪費(fèi)些空間, 因?yàn)樗粫褂媚切┳隽薲elete操作的塊空間. NOAPPEND提示則相反,所以會取消PARALLEL提示的默認(rèn)APPEND提示.

      例如:insert /*+ append */ into test1 select * from test4;

      insert /*+ parallel(test1) noappend */ into test1 select * from test4;

      10. /*+ USE_HASH(TABLE1,table2) */

      將指定的表與其它行源通過哈希連接方式連接起來.為較大的結(jié)果集提供最佳響應(yīng)時(shí)間. 類似于在連接表的結(jié)果中遍歷每個表上每個結(jié)果的嵌套循環(huán), 指定的hash表將被放入內(nèi)存, 所以需要有足夠的內(nèi)存(hash_area_size或pga_aggregate_target)才能保證語句正確執(zhí)行, 否則將在磁盤里進(jìn)行.

      例如:SELECT /*+ USE_HASH(BSEMPMS,BSDPTMS) */ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

      ----------------------------------------------------------------------------------------------------

      11. /*+ USE_MERGE(TABLE) */

      將指定的表與其它行源通過合并排序連接方式連接起來.特別適合于那種在多個表大量行上進(jìn)行集合操作的查詢, 它會將指定表檢索到的的所有行排序后再被合并, 與USE_NL剛好相反.

      例如:SELECT /*+ USE_MERGE(BSEMPMS,BSDPTMS) */ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

      12. /*+ ALL_ROWS */

      表明對語句塊選擇基于開銷的優(yōu)化方法,并獲得最佳吞吐量,使資源消耗最小化. 可能會限制某些索引的使用.

      例如:SELECT /*+ ALL+_ROWS */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

      13. /*+ CLUSTER(TABLE) */

      提示明確表明對指定表選擇簇掃描的訪問方法. 如果經(jīng)常訪問連接表但很少修改它, 那就使用集群提示.

      例如:SELECT /*+ CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

      14. /*+ INDEX_ASC(TABLE INDEX1, INDEX2) */

      表明對表選擇索引升序的掃描方法. 從8i開始, 這個提示和INDEX提示功能一樣, 因?yàn)槟J(rèn)oracle就是按照升序掃描索引的, 除非未來oracle還退出降序掃描索引.

      例如:SELECT /*+ INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

      15. /*+ INDEX_COMBINE(TABLE INDEX1, INDEX2) */

      指定多個位圖索引, 對于B樹索引則使用INDEX這個提示,如果INDEX_COMBINE中沒有提供作為參數(shù)的索引,將選擇出位圖索引的布爾組合方式.

      例如:SELECT /*+ INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI) */ * FROM BSEMPMS WHERE SAL<5000000 AND HIREDATE

      16. /*+ INDEX_JOIN(TABLE INDEX1, INDEX2) */

      合并索引, 所有數(shù)據(jù)都已經(jīng)包含在這兩個索引里, 不會再去訪問表, 比使用索引并通過rowid去掃描表要快5倍.

      例如:SELECT /*+ INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI) */ SAL,HIREDATE FROM BSEMPMS WHERE SAL<60000;

      17. /*+ INDEX_DESC(TABLE INDEX1, INDEX2) */

      表明對表選擇索引降序的掃描方法.

      例如:SELECT /*+ INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

      18. /*+ INDEX_FFS(TABLE INDEX_NAME) */

      對指定的表執(zhí)行快速全索引掃描,而不是全表掃描的辦法.要求要檢索的列都在索引里, 如果表有很多列時(shí)特別適用該提示.

      例如:SELECT /*+ INDEX_FFS(BSEMPMS IN_EMPNAM) */ * FROM BSEMPMS WHERE DPT_NO='TEC305';

      19. /*+ NO_EXPAND */

      對于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優(yōu)化器對其進(jìn)行擴(kuò)展, 縮短解析時(shí)間.

      例如:SELECT /*+ NO_EXPAND */ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

      20. /*+ DRIVING_SITE(TABLE) */

      強(qiáng)制與ORACLE所選擇的位置不同的表進(jìn)行查詢執(zhí)行.特別適用于通過dblink連接的遠(yuǎn)程表.

      例如:SELECT /*+ DRIVING_SITE(DEPT) */ * FROM BSEMPMS,DEPT@BSDPTMS DEPT WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

      21. /*+ CACHE(TABLE) */ 和 /*+ NOCACHE(TABLE) */

      當(dāng)進(jìn)行全表掃描時(shí),CACHE提示能夠?qū)⒈砣烤彺娴絻?nèi)存中,這樣訪問同一個表的用戶可直接在內(nèi)存中查找數(shù)據(jù). 比較適合數(shù)據(jù)量小但常被訪問的表, 也可以建表時(shí)指定cache選項(xiàng)這樣在第一次訪問時(shí)就可以對其緩存. NOCACHE則表示對已經(jīng)指定了CACHE選項(xiàng)的表不進(jìn)行緩存.

      例如:SELECT /*+ FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

      22. /*+ PUSH_SUBQ */

      當(dāng)SQL里用到了子查詢且返回相對少的行時(shí), 該提示可以盡可能早對子查詢進(jìn)行評估從而改善性能, 不適用于合并連接或帶遠(yuǎn)程表的連接.

      例如:select /*+ PUSH_SUBQ */ emp.empno, emp.ename, itemno from emp, orders where emp.empno = orders.empno and emp.deptno = (select deptno from dept where loc='XXX');

      23. /*+ INDEX_SS(TABLE INDEX1,INDEX2) */

      指示對特定表的索引使用跳躍掃描, 即當(dāng)組合索引的第一列不在where子句中時(shí), 讓其使用該索引.

    【Oracle10g常見HINT的用法】相關(guān)文章:

    常見的網(wǎng)絡(luò)診斷命令用法09-25

    英語常見助動詞的用法06-08

    雅思聽力考試常見詞及用法09-10

    常見比較級的構(gòu)成和用法總結(jié)08-13

    sun認(rèn)證Java枚舉常見7種用法08-19

    SQL優(yōu)化過程中常見OracleHINT用法盤點(diǎn)06-23

    JavaScript中常見的字符串操作函數(shù)及用法07-24

    常見比較級和最高級的用法歸納09-02

    redhatlinux下安裝oracle10g的教程09-30

    2017小升初語文知識積累:常見典故及其用法08-04

    主站蜘蛛池模板: 久久久久女人精品毛片| 久久er国产精品免费观看2| 精品国产v无码大片在线观看| 国产成人精品日本亚洲专区| 精品无码国产一区二区三区AV | 久久精品国产亚洲麻豆| 无码乱码观看精品久久| 亚洲午夜精品久久久久久人妖| 亚洲国产精品无码久久| 国精品产露脸自拍| 国产成人精品高清在线观看99| 欲帝精品福利视频导航| 国产精品主播一区二区| 国产欧美国产精品第一区| 无码囯产精品一区二区免费 | 亚洲国产精品嫩草影院在线观看| 国产高清在线精品一区二区| 99精品国产在热久久| 久久国产精品99国产精| 亚洲精品成人片在线观看精品字幕| 国内精品久久久久久久亚洲 | 国产91精品在线| 国产精品一区二区久久国产| 午夜精品久久久久久毛片| 亚洲国产综合精品中文字幕 | 亚洲精品国产va在线观看蜜芽| 久久久久无码精品| 国产精品亚洲产品一区二区三区| 99久re热视频这里只有精品6| 九九在线精品视频专区| 6一12呦女精品| 精品国产sm捆绑最大网免费站| 少妇人妻精品一区二区三区| 亚洲αv在线精品糸列| 亚洲精品国偷自产在线| 亚洲精品白浆高清久久久久久| 日韩一区二区三区精品| 亚洲国产91精品无码专区| 免费视频精品一区二区| 欧美成人精品欧美一级乱黄码| 精品一区二区三区色花堂|