NEST LOOP改為HASH JOIN 效能提高6倍
NEST LOOP改為HASH JOIN 效能提高6倍
Kevin Zou
2011-8-31
在看系統的AWR report時,發現有個SQL語句出現頻率很高,而且都是在消耗資源的top 5內。決定把這個SQL拉出來看看。
523,370 1 523,370.0 2.7 253.31 2576.45 bcy886xsqp4u1
Module: sqr@phcmdb (TNS V1-V3)
SELECT b.EMPLID, b.DUR, b.TRC, b.TL_QUANTITY, b.ACTUAL_PUB_DATE, b.PAYABLE_STATU
S, b.TL_PYBL_REASON_CD from ps_job a, ps_tl_payable_time b where a.emplid = b.e
mplid and a.empl_rcd = b.empl_rcd and a.effdt = (select max(a_ed.effdt) from ps_
job a_ed where a.emplid = a_ed.emplid and a.empl_rcd = a_ed.empl_rcd and a_ed.ef
通過V$SQL找到完整的SQL語句:
SELECT b.EMPLID, b.DUR, b.TRC, b.TL_QUANTITY, b.ACTUAL_PUB_DATE, b.PAYABLE_STATUS,
b.TL_PYBL_REASON_CD from ps_job a, ps_tl_payable_time b where a.emplid = b.emplid
and a.empl_rcd = b.empl_rcd
and a.effdt = (select max(a_ed.effdt) from sysadm.ps_job a_ed where a.emplid = a_ed.emplid
and a.empl_rcd = a_ed.empl_rcd and a_ed.effdt <= B.DUR)
AND a.EFFSEQ =(SELECT MAX(a_es.EFFSEQ) FROM sysadm.ps_job a_es WHERE a.EMPLID=a_es.EMPLID
AND a.EMPL_RCD=a_es.EMPL_RCD AND a_es.EFFDT=a.EFFDT) AND A.COMPANY = '&py'
AND B.DUR BETWEEN '01-JAN-2011' AND '15-AUG-2011' AND A.PAYGROUP IN('2DS')
AND B.TRC IN ('2OT10','2OT15','2OT20','2OT30') Order by b.EMPLID,b.DUR,b.TRC
ps_job表有130W的資料;
ps_tl_payable_time 有430W的資料;
檢視其執行計劃:
|
看到兩個大表在做NEST LOOP.這明顯是不合理的。
檢視其消耗的資源:
SYS@hr9prd>select RUNTIME_MEM , FETCHES , EXECUTIONS , DISK_READS , BUFFER_GETS ,USER_IO_WAIT_TIME ,ROWS_PROCESSED
from v$sqlarea
where sql_id ='bcy886xsqp4u1' 2 3 ;
RUNTIME_MEM FETCHES EXECUTIONS DISK_READS BUFFER_GETS USER_IO_WAIT_TIME ROWS_PROCESSED
----------- ---------- ---------- - --------- ----------- ----------------- --------------
26448 132435 1 599315 20765595 2611266235 1324338
USER_IO_WAIT_TIME為2611266235microseconds = 2611 seconds. 而在AWR REPORT中SQL elapsed time為 2576.45 (這裡USER_IO_WAIT_TIME >elapsed_time ,可能是兩者的統計有出入導致,在這裡不是重點)。說明SQL的等待時間全部都是發在IO 等待上。
加入HINT,改寫SQL
|
整個SQL用時6分15秒就執行完畢。
對比RUNTIME STATS:
前 後 比較
physical reads 599315 1572401 增加了973086
consistent gets 20765595 7622155 減少了13143440
Elaped Time 2576.45 375 僅為之前的15%
如果看到兩個大表直接做聯合,如果優化器選擇了NEST LOOP 作為ACCESS PATH,執行效率很差,要考慮改為HASH JOIN 以提高效能。
-THE END-
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-706387/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hash join\nest loop join\sort merge join的實驗OOP
- HASH JOIN ,MERGE JOIN ,NESTED LOOPOOP
- nested loop,sort merge join,hash joinOOP
- Mysql join 的本質,Nested Loop Join 和 Hash JoinMySqlOOP
- HASH JOIN ,MERGE JOIN ,NESTED LOOP(R2)OOP
- HASH JOIN ,MERGE JOIN ,NESTED LOOP的比較OOP
- 表的連線方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN(轉)OOP
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- ORACLE Hash JoinOracle
- 【MySQL】MySQL效能優化之Block Nested-Loop Join(BNL)MySql優化BloCOOP
- HASH join詳解
- 用hash cluster表提高查詢效能 (一)
- 【MySQL】MySQL效能最佳化之Block Nested-Loop Join(BNL)MySqlBloCOOP
- 笛卡爾積和NEST LOOP產生的影響OOP
- Hash join演算法原理演算法
- nest loop內層迴圈會按照rowid排序嗎?OOP排序
- Hash join演算法原理(轉)演算法
- Oracle中的Hash Join祥解Oracle
- Oracle 的 hash join連線方式Oracle
- oracle hash join演算法原理Oracle演算法
- Oracle中的Hash Join詳解Oracle
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- oracle hash join原理及注意事項Oracle
- Oracle中的Hash Join詳解 ztOracle
- 資料庫實現原理#1(Nested Loop Join)資料庫OOP
- 資料庫實現原理#4(Hash Join)資料庫
- oralce之 10046對Hash Join分析
- hash join構建點陣圖的理解
- 對Hash Join的一次優化優化
- 【sql調優之執行計劃】nested loops join and nested loop join outerSQLOOP
- Oracle中的Hash Join祥解(R2)Oracle
- 【sql調優之執行計劃】hash joinSQL
- oracle實驗記錄 (計算hash join cost)Oracle
- 通過swap_join_inputs來控制多表連線hash join中的build tableUI
- Oracle多表關聯更新的方式選擇, Loop or Hash update?OracleOOP
- nested loops 和hash join的一點測試OOP
- oracle實驗記錄 (PGA manual or auto 與hash join)Oracle
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle