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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql join 的本質,Nested Loop Join 和 Hash JoinMySqlOOP
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- 用hash cluster表提高查詢效能 (一)
- Hash join演算法原理(轉)演算法
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- [20180705]關於hash join 2.txt
- hash join構建點陣圖的理解
- 資料庫實現原理#4(Hash Join)資料庫
- 資料庫實現原理#1(Nested Loop Join)資料庫OOP
- 20200909]為什麼執行計劃不是出現hash join semi.txt
- [20200306]hash join會提前終止掃描嗎.txt
- [20180713]關於hash join 測試中一個疑問.txt
- flinkSql join redis的hash結構維表簡單實現SQLRedis
- MYSQL count標量子查詢改left joinMySql
- 歪門邪道效能優化:魔改三方庫原始碼,效能提高几十倍!優化原始碼
- JUC包中的分而治之策略-為提高效能而生
- 為什麼說不變模式可以提高效能模式
- 從Hash Join的執行計劃的細節中能看到點啥
- join、inner join、left join、right join、outer join的區別
- 3 效能改進方法
- 怎樣提高insert的效能
- 如何提高python程式的效能Python
- 透過 CancellationToken 提高 Web 效能Web
- 如何提高前端效能——字型篇前端
- Event loop的化繁為簡(一)OOP
- Event loop的化繁為簡(二)OOP
- MySQL LEFT JOIN/ INNER JOIN/RIGHT JOINMySql
- MySQL表的增刪查改(提高篇)MySql
- 效能優化篇 - js事件迴圈機制(event loop)優化JS事件OOP
- Redis效能提高之批量和管道Redis
- 使用 Traefik 提高 WebSocket 應用效能Web
- 如何提高 Locust 的壓測效能
- 如何提高Linux伺服器效能Linux伺服器
- 伺服器的效能如何提高伺服器
- Nest 快速通關攻略
- 效能最佳化陷阱之hash真的比strcmp快嗎
- 提高 PostgreSQL 插入效能的 5 個技巧SQL
- GameMode:提高 Linux 遊戲效能的工具GAMLinux遊戲
- 【譯】使用kotlin協程提高app效能KotlinAPP