【TUNE_ORACLE】Oracle Hint之概念與用法
說明
Hint相關文章地址:
Oracle Hint之概念與用法: http://blog.itpub.net/69992972/viewspace-2756965/
Oracle Hint之常用Hint功能概述(一): http://blog.itpub.net/69992972/viewspace-2757087/
Oracle Hint之常用Hint功能概述(二): http://blog.itpub.net/69992972/viewspace-2757182/
Oracle Hint之常用Hint功能概述(三): http://blog.itpub.net/69992972/viewspace-2757238/
Oracle Hint之常用Hint功能概述(四): http://blog.itpub.net/69992972/viewspace-2757242/
Oracle Hint之常用Hint功能概述(五): http://blog.itpub.net/69992972/viewspace-2757273/
什麼是Hint
1. 1Hint這個單詞直譯過來就是“提示;暗示”,是一種人為主動傳達給SQL最佳化器的“提示”(指令)用來干預SQL解析策略資訊的一種重要手段,除非某些條件阻止(下文有舉例說明),否則最佳化器會使用hint為語句選擇執行計劃; 通俗解釋hint就是:如果你覺得SQL最佳化器的執行計劃不符合你的預期,你就可透過使用hint去主動去調整SQL的執行計劃。
2. Hint表現形式是一種嵌入在SQL語句中特殊的註釋。
3. 需要注意,僅在收集了有關表的統計資訊並評估了最佳化器計劃之後,才應“謹慎使用”Hint。更改資料庫條件以及在後續釋出Oracle新版本中查詢效能的增強可能會對原來程式碼中的Hint效能產生重大改變!
Hint語法
雖然hint是一種特殊的註釋,但歸根結底寫法還是註釋的寫法,但略有區別,具體寫法如下:
1. Hint註釋必須緊跟在SQL語句塊的第一個關鍵字之後。
可以使用兩種註釋方式:斜槓(
/*
)或破折號(
--
)。
加號(
+
)提示定界符必須緊跟在註釋定界符之後,
加號前不允許有空格,但
加號後的空格是可選的:
SELECT /*+ hint內容 */ FROM table;
2. 語句塊只能有一個包含提示的註釋,但它可以包含許多以空格分隔的提示。 將多個hints至少隔開一個空格:
SELECT /*+ FULL(hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp;
Hint型別
1.單表
使用hint時,只把一張表或一個檢視的全稱或別名寫入hint中,如:
SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id FROM employees WHERE department_id > 50;
2.多表
使用hint時,多張表或多個檢視的全稱或別名寫入hint中,同時作用於多張表和檢視,如:
SELECT /*+ LEADING(e j) */ * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date;
注:USE_NL(table1 table2)不是多表hint,因為它是USE_NL(table1)和USE_NL(table2)因為它是簡化寫法。
3.查詢塊
查詢塊提示對單個查詢塊起作用,比如hint裡的STAR_TRANSFORMATION和UNNEST。以下語句使用查詢塊hint來指定該hint裡的FULL僅作用於引用的employees的查詢塊:
SELECT /*+ INDEX(t1) FULL( t1) */ COUNT(*) FROM jobs t1 WHERE t1.job_id IN (SELECT job_id FROM employees t1);
注:hint生效範圍僅限於它本身所在的查詢塊,如果不指定查詢塊作用區域,它的預設生效範圍就是該hint自身所處的查詢塊。
4.Statement
Statement hint適用於整個SQL語句,比如ALL_ROWS:
SELECT /*+ ALL_ROWS */ * FROM emp;
Hint適用範圍
1.簡單的MERGE,SELECT,INSERT,UPDATE,或DELETE語句
2.父語句(parent statement)或複雜語句的子查詢
3.使用的運算子集合的查詢的一部分(UNION,MINUS,INTERSECT)
Hint其他注意事項
1.一般使用了hint之後,最佳化器預設使用CBO模式(除DRIVING_SITE和RULE可以在RBO使用並且不會啟用CBO以外)
2.如果hint裡的表和檢視在SQL中有別名,在hint裡必須使用別名
3.hint裡的表名、檢視名和索引名之前不能帶上schema,如user.table這種形式就不合法
4.導致hint失效的原因(會直接當普通註釋處理):
1)hint不合法
2)hint在某些特定SQL中直接失效,如標量子查詢想用USE_NL和LEADING指定子查詢裡的表為驅動表(該型別語句的驅動表必為主表)
3)有查詢轉換
4)多個hint互斥,直接會把這些hint直接無效化,如既使用INDEX又使用FULL
5)hint拼寫錯誤
6)hint會直接導致SQL執行結果出錯
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2756965/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(五)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(四)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(三)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(一)Oracle
- Oracle Hint的用法Oracle
- (轉)Oracle Hint的用法Oracle
- 常見Oracle HINT的用法Oracle
- zt_Oracle hint driving_site Hint的用法Oracle
- 【TUNE_ORACLE】Oracle資料庫與HugePages(一)HugePages概念和優勢Oracle資料庫
- oracle之hint概述Oracle
- oracle hint之hint_index_ffs,index_joinOracleIndex
- Linux防火牆之IPtables概念與用法(轉)Linux防火牆
- Oracle之Hint使用總結Oracle
- Oracle hint之DRIVING_SITEOracle
- 【TUNE_ORACLE】Oracle檢查點(一)檢查點(Checkpoint)概念介紹Oracle
- oracle hintOracle
- CARDINALITY HINT用法小試
- 【TUNE_ORACLE】等待事件之等待事件類別Oracle事件
- 【TUNE_ORACLE】等待事件之“buffer busy waits”Oracle事件AI
- 【TUNE_ORACLE】等待事件之“library cache lock”Oracle事件
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- ORACLE 部分HINTOracle
- oracle hint (續)Oracle
- Oracle Hint 精華Oracle
- 【TUNE_ORACLE】等待事件之IO等待“direct path write”Oracle事件
- 【TUNE_ORACLE】等待事件之“library cache pins”Oracle事件
- oracle常見hintOracle
- oracle hint簡述Oracle
- oracle hint (續-0)Oracle
- oracle hint_no_indexOracleIndex
- Oracle Hint 精華文章Oracle
- 常用的Oracle HintOracle
- Oracle Hint 詳解Oracle
- 【TUNE_ORACLE】Oracle資料庫與HugePages(二)HugePages配置和限制Oracle資料庫
- 【TUNE_ORACLE】等待事件之IO等待“direct path read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file parallel write”Oracle事件Parallel
- 【TUNE_ORACLE】等待事件之IO等待“direct path write temp”Oracle事件