ORACLE的HINT詳解
提示(hints)就是一組指示余素,可以將其添加到SQL中來指示優(yōu)化器×琢觯可以使用提示來明確指定連接順序芒篷、訪問路徑類型、所使用的索引采缚、優(yōu)化目標(biāo)等其他指示针炉。
優(yōu)化器提示出現(xiàn)在SQL第一個(gè)單詞(如:SELECT、INSERT扳抽、UPDATE篡帕、MERGE或者DELETE)后面,如同一個(gè)注釋贸呢。與注釋不同的是在(/*)后面有一個(gè)加號(+)镰烧。
?例如:
???????? SELECT /*+ FULL(orders) */? FROM oe.orders WHERE order_date <(SYSDATE - INTERVAL ' 5 ' YEAR)
如果語(句)法不對,則ORACLE會(huì)自動(dòng)忽略所寫的HINT贮尉,不報(bào)錯(cuò)拌滋。其中FULL表示朴沿,優(yōu)化器必須選擇使用全表掃描的訪問方法猜谚。除了FULL,還有:
1. /*+ALL_ROWS*/:表明對語句塊選擇基于開銷的優(yōu)化方法,并獲得最佳吞吐量,使資源消耗最小化.
2. /*+FIRST_ROWS*/:表明對語句塊選擇基于開銷的優(yōu)化方法,并獲得最佳響應(yīng)時(shí)間,使資源消耗最小化.
3. /*+CHOOSE*/:表明如果數(shù)據(jù)字典中有訪問表的統(tǒng)計(jì)信息,將基于開銷的優(yōu)化方法,并獲得最佳的吞吐量;
表明如果數(shù)據(jù)字典中沒有訪問表的統(tǒng)計(jì)信息,將基于規(guī)則開銷的優(yōu)化方法;
4. /*+RULE*/:表明對語句塊選擇基于規(guī)則的優(yōu)化方法.
5. /*+FULL(TABLE)*/:表明對表選擇全局掃描的方法.
6. /*+ROWID(TABLE)*/:提示明確表明對指定表根據(jù)ROWID進(jìn)行訪問.
7. /*+CLUSTER(TABLE)*/:提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對象有效.
8. /*+INDEX(TABLE INDEX_NAME)*/:表明對表選擇索引的掃描方法.
9. /*+INDEX_ASC(TABLE INDEX_NAME)*/:表明對表選擇索引升序的掃描方法.
10. /*+INDEX_COMBINE*/:為指定表選擇位圖訪問路經(jīng),如果INDEX_COMBINE中沒有提供作為參數(shù)的索引,將選擇出位圖索引的布爾組合方式.
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/:提示明確命令優(yōu)化器使用索引作為訪問路徑.
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/:表明對表選擇索引降序的掃描方法.
13. /*+INDEX_FFS(TABLE INDEX_NAME)*/:對指定的表執(zhí)行快速全索引掃描,而不是全表掃描的辦法.
14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/:提示明確進(jìn)行執(zhí)行規(guī)劃的選擇,將幾個(gè)單列索引的掃描合起來.
15. /*+USE_CONCAT*/:對查詢中的WHERE后面的OR條件進(jìn)行轉(zhuǎn)換為UNION ALL的組合查詢.
16. /*+NO_EXPAND*/:對于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優(yōu)化器對其進(jìn)行擴(kuò)展.
17. /*+NOWRITE*/:禁止對查詢塊的查詢重寫操作.
18. /*+REWRITE*/:可以將視圖作為參數(shù).
19. /*+MERGE(TABLE)*/:能夠?qū)σ晥D的各個(gè)查詢進(jìn)行相應(yīng)的合并