1. 程式人生 > >使用hint優化 Oracle SQL語句方法30例

使用hint優化 Oracle SQL語句方法30例

在SQL語句優化過程中,我們經常會用到hint,現總結一下在SQL優化過程中常見Oracle HINT的用法:

1. /*+ALL_ROWS*/
表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明對語句塊選擇基於開銷的優化方法,並獲得最佳響應時間,使資源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

3. /*+CHOOSE*/
表明如果資料字典中有訪問表的統計資訊,將基於開銷的優化方法,並獲得最佳的吞吐量;
表明如果資料字典中沒有訪問表的統計資訊,將基於規則開銷的優化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

4. /*+RULE*/
表明對語句塊選擇基於規則的優化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

5. /*+FULL(TABLE)*/
表明對錶選擇全域性掃描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

6. /*+ROWID(TABLE)*/
提示明確表明對指定表根據ROWID進行訪問.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';

7. /*+CLUSTER(TABLE)*/
提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇物件有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

8. /*+INDEX(TABLE INDEX_NAME)*/
表明對錶選擇索引的掃描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';

9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明對錶選擇索引升序的掃描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

10. /*+INDEX_COMBINE*/
為指定表選擇點陣圖訪問路經,如果INDEX_COMBINE中沒有提供作為引數的索引,將選擇出點陣圖索引的布林組合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE<SYSDATE;

11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明確命令優化器使用索引作為訪問路徑.
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;

12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明對錶選擇索引降序的掃描方法.
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
對指定的表執行快速全索引掃描,而不是全表掃描的辦法.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';

14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明確進行執行規劃的選擇,將幾個單列索引的掃描合起來.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';

15. /*+USE_CONCAT*/
對查詢中的WHERE後面的OR條件進行轉換為UNION ALL的組合查詢.
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

16. /*+NO_EXPAND*/
對於WHERE後面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基於優化器對其進行擴充套件.
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';

17. /*+NOWRITE*/
禁止對查詢塊的查詢重寫操作.

18. /*+REWRITE*/
可以將檢視作為引數.

19. /*+MERGE(TABLE)*/
能夠對檢視的各個查詢進行相應的合併.
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;

20. /*+NO_MERGE(TABLE)*/
對於有可合併的檢視不再合併.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;

21. /*+ORDERED*/
根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連線.
例如:
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;

22. /*+USE_NL(TABLE)*/
將指定表與巢狀的連線的行源進行連線,並把指定表作為內部表.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

23. /*+USE_MERGE(TABLE)*/
將指定的表與其他行源通過合併排序連線方式連線起來.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

24. /*+USE_HASH(TABLE)*/
將指定的表與其他行源通過雜湊連線方式連線起來.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

25. /*+DRIVING_SITE(TABLE)*/
強制與ORACLE所選擇的位置不同的表進行查詢執行.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,
[email protected]
WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

26. /*+LEADING(TABLE)*/
將指定的表作為連線次序中的首表.

27. /*+CACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩衝區快取中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

28. /*+NOCACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩衝區快取中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

29. /*+APPEND*/
直接插入到表的最後,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;

30. /*+NOAPPEND*/
通過在插入語句生存期內停止並行模式來啟動常規插入.
insert /*+noappend*/ into test1 select * from test4 ;

相關推薦

使用hint優化 Oracle SQL語句方法30

在SQL語句優化過程中,我們經常會用到hint,現總結一下在SQL優化過程中常見Oracle HINT的用法:1. /*+ALL_ROWS*/表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化.例如:SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN F

Oracle SQL語句之常見優化方法總結

下面列舉一些工作中常常會碰到的Oracle的SQL語句優化方法:1、SQL語句儘量用大寫的; 因為oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。2、使用表的別名:  當在SQL語句中連線多個表時, 儘量使用表的別名並把別名字首於每個列上。這樣一來,就可以減

oraclehint的使用-SQL語句優化

表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明對語句塊選擇基於開銷的優化方

Oracle SQL語句常見優化方法總結

1、SQL語句儘量用大寫的;  因為oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。 2、使用表的別名:   當在SQL語句中連線多個表時, 儘量使用表的別名並把別名字首於每個列上。這樣一來, 就可以減少解析的時間並減少那些由列歧義引起的語法錯誤。

ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句方法

1. ORACLE中檢視當前系統中鎖表情況 select * from v$locked_object 可以通過查詢v$locked_object拿到sid和objectid,然後用sid和v$session連結串列查詢是哪裡鎖的表,用v$sessio

使用hint優化Oracle的執行計劃 以及 SQL Tune Advisor的使用

背景: 某表忽然出現查詢非常緩慢的情況,cost 100+ 秒以上;嚴重影響生產。 原SQL: explain plan for select * from ( select ID id,RET_NO retNo, FROM_SYS fromSy, TO_SYS to

使用hint優化Oracle的運行計劃 以及 SQL Tune Advisor的使用

dual sss 嚴重 acl lang put rec fix values 背景: 某表忽然出現查詢很緩慢的情況。cost 100+ 秒以上;嚴重影響生產。

關於oracle sql語句查詢時 表名和字段名要加雙引號的問題具體解釋

ont tin rac 作者 什麽 因此 tro 們的 reg 作為oracle的剛開始學習的人相信大家一定會遇到這個問題。如圖: 明明就是navicat可視化創建了表,但是就是不能查到!這個

數據庫性能優化SQL語句優化(轉 java知音)

可能 資源 詳細介紹 有助於 效果 這就是 詳細 分組統計 完全 一、問題的提出 在應用系統開發初期,由於開發數據庫數據比較少,對於查詢SQL語句,復雜視圖的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著數據庫中數據的增加,系統的

數據庫優化SQL語句優化-記錄

得到 顯式 重要 adding sys 狀態 檢驗 發現 最大數 1. 操作符優化 (a) IN 操作符 從Oracle執行的步驟來分析用IN的SQL與不用IN的SQL有以下區別: ORACLE試圖將其轉換成多個表的連接,如果轉換不成功則先執行IN裏面的子查詢,再查詢外層的

MyBatis攔截器打印不帶問號的完整sql語句方法

pac con his cee != Coding word sqli statement ?1/* Preparing: SELECT * FROM tb_user WHERE id = ? AND user_name = ? <br> 目標是打印:SE

【筆記】Oracle SQL語句 | 基礎篇

when 自然 本地數據庫 指向 ise abort ted names pda 整理了一下Oracle SQL的基本語句,主要針對Oracle的使用者(Oracle數據庫維護和管理員的常用語句之後整理),可作為一個大綱參考,對某些語句或函數並未深入的詳解,只是簡單列出,留

mysql優化sql語句優化總結

結構 沒有 sele 大量 unsigned 他還 判斷 pla 可能 mysql性能優化 1、 EXPLAIN 你的 SELECT 查詢。使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。 2、為

簡單的oracle sql語句練習

簡單的oracle sql語句練習 求每個部門的平均薪水 select deptno,avg(sal) from emp group by deptno 每個部門同一個職位的最大工資 select deptno,job,max(sal) from emp group by deptno,job 按照

MySQL(二) —— MySQL效能優化SQL語句優化

          SQL語句優化   MySQL優化的目的   1、避免出現頁面訪問錯誤:或由於資料庫連線超時 timeout 產生頁面5xx錯誤;或由於慢查詢造成頁面無法載入;或由於阻        塞造成資料無法提交;

oracle sql語句建立表空間、使用者、並給使用者賦予許可權

--建立表空間、大小100m,自增長50m ,最大為 2G;位置: 'h:\app\a.dbf' create tablespace 表空間名 datafile 'h:\app\a.dbf' size 100m autoextend on next 50m maxsize 20480m ext

Oracle sql語句中(+)作用,就是匹配表

轉:https://www.cnblogs.com/ahudyan-forever/p/5703982.html Oracle sql語句中(+)作用 select * from operator_info o, group_info g  where o.group_id = g

MySQL(二) —— MySQL效能優化SQL語句優化

          SQL語句優化 MySQL優化的目的   1、避免出現頁面訪問錯誤:或由於資料庫連線超時 timeout 產生頁面5xx錯誤;或由於慢查詢造成頁面無法載入;或由於阻        塞造成資料無法提交;   2、增加資料庫的穩定性:避免由於低效查詢

mysql資料庫優化大全--sql語句優化大全

一,SQL語句效能優化 1, 對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索 引。 2,應儘量避免在 where 子句中對欄位進行 null 值判斷,建立表時NULL是預設值,但大多數時候 應該使用NOT N

SQL語句方法

生成資料庫欄位和備註的方法,.前面是要生成的表的名字 後面是資料庫的名字 SELECT COLUMN_NAME,column_comment FROM INFORMATION_SCHEMA.Columns WHERE table_name='jcwy_prope