【TUNE_ORACLE】Oracle Hint之概念與用法

Attack_on_Jager發表於2021-02-09

說明

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章