Oracle Hints是一種機制,用來告訴優化器按照我們的制定的方式生成執行計劃,而不是根據它自己的分析生成執行計劃,
一、我們可以用Oracle Hints來實作
1) 使用的優化器的型別,
2) 基于代價的優化器的優化目標,是all_rows還是first_rows,
3) 表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid,
4) 表之間的連接型別,
5) 表之間的連接順序,
6) 陳述句的并行程度,
二、Hints應用要求
Hints只應用在它們所在sql陳述句塊(statement block,由select、update、delete、insert關鍵字標識)上,對其它SQL陳述句或陳述句的其它部分沒有影響,
三、使用Oracle Hints的語法
{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
or
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...
1) 如果包含多個提示,則每個提示之間需要用一個或多個空格隔開,
2) text 是其它說明hints的注釋性文本,
3)使用表別名,如果在查詢中指定了表別名,那么提示必須也使用表別名,例如:
select /*+ index(d,demo_idx) */ * from demo d;
4)不要在提示中使用模式名稱:如果在提示中指定了模式的所有者,那么提示將被忽略,例如:
select /*+ index(scott.emp,demo_idx) */ * from demo d;
四、Hints的具體用法
優化器相關的hints
1、/*+ ALL_ROWS */
表明對陳述句塊選擇基于開銷的優化方法,并獲得最佳吞吐量,使資源消耗最小化,
SELECT /*+ ALL+_ROWS*/ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';
2、/*+ FIRST_ROWS(n) */
表明對陳述句塊選擇基于開銷的優化方法,并獲得最佳回應時間,使資源消耗最小化,
SELECT /*+FIRST_ROWS(20) */ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';
3、/*+ RULE*/
表明對陳述句塊選擇基于規則的優化方法,
SELECT /*+ RULE */ DEMO_NO,DEMO_NAME,DEMO_ADDR FROM DEMO WHERE DEMO_NO='ITWUYI';
訪問路徑相關的hints
1、/*+ FULL(TABLE)*/
表明對表選擇全域掃描的方法,
SELECT /*+FULL(A)*/ DEMO_NO,DEMO_NAME FROM DEMO A WHERE DEMO_NO='ITWUYI';
2、/*+ INDEX(TABLE INDEX_NAME) */
表明對表選擇索引的掃描方法,
SELECT /*+INDEX(DEMO SEX_INDEX) */ * FROM DEMO WHERE SEX='M';
3、/*+ INDEX_ASC(TABLE INDEX_NAME)*/
表明對表選擇索引升序的掃描方法,
SELECT /*+INDEX_ASC(DEMO PK_DEMO) */ * FROM DEMO WHERE DPT_NO='ITWUYI';
4、/*+ INDEX_COMBINE*/
為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為引數的索引,將選擇出位圖索引的布爾組合方式,
SELECT /*+INDEX_COMBINE(DEMO SAL_BMI HIREDATE_BMI) */ * FROM DEMO WHERE SAL<5000000 AND HIREDATE;
5、/*+ INDEX_JOIN(TABLE INDEX_NAME1 INDEX_NAME2) */
當謂詞中參考的列都有索引的時候,可以通過指定采用索引關聯的方式,來訪問資料,
select /*+ index_join(t t_ind t_bm) */ id from t where id=100 and object_name='ITWUYI';
6、/*+ INDEX_DESC(TABLE INDEX_NAME)*/
表明對表選擇索引降序的掃描方法,
SELECT /*+INDEX_DESC(DEMO PK_DEMO) */ * FROM DEMO WHERE DPT_NO='ITWUYI';
7、/*+ INDEX_FFS(TABLE INDEX_NAME) */
對指定的表執行快速全索引掃描,而不是全表掃描的辦法,
SELECT /* + INDEX_FFS(DEMO IN_EMPNAM)*/ * FROM DEMO WHERE DPT_NO='TEC305';
8、/*+ INDEX_SS(T T_IND) */
從9i開始,oracle引入了這種索引訪問方式,當在一個聯合索引中,某些謂詞條件并不在聯合索引的第一列時,可以通過Index Skip Scan來訪問索引獲得資料,當聯合索引第一列的唯一值個數很少時,使用這種方式比全表掃描效率高,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/240112.html
標籤:其他
上一篇:讀取檔案路徑的5種常用方式
下一篇:Jdbc基礎五步
