多表連線SQL優化如何處理
select a.inst_id , count(*) from
(
SELECT L.USER_ID, R.RESP_APPL_ID, R.RESPONSIBILITY_ID, F.AUDSID,S.SID,
USR.USER_NAME, RSP.RESPONSIBILITY_NAME, FRM.USER_FORM_NAME, S.INST_ID
FROM FND_RESPONSIBILITY_TL RSP, -- 3188 rows
FND_FORM_TL FRM, -- 8992
FND_USER USR, -- 39400
FND_LOGINS L, -- 510000
FND_LOGIN_RESPONSIBILITIES R, --- 280000
FND_LOGIN_RESP_FORMS F, --- 1120000
GV$SESSION S --- VIEW 300
WHERE R.LOGIN_ID = F.LOGIN_ID
AND R.LOGIN_RESP_ID = F.LOGIN_RESP_ID -- R, F 表中 LOGIN_ID , LOGIN_RESP_ID 聯合索引
AND L.LOGIN_ID = R.LOGIN_ID --- L 表中 LOGIN_ID 唯一索引
AND L.END_TIME IS NULL ----- L 表中 END_TIME is NULL 為 38萬
AND R.END_TIME IS NULL ----- R 表中 END_TIME is NULL 為 10 萬
AND F.END_TIME IS NULL ----- F 表中 END_TIME is NULL 為 12 萬
AND L.USER_ID = USR.USER_ID -- L, USR 表中 USER_ID 存在索引 , USR中是唯一的 。
AND R.RESPONSIBILITY_ID = RSP.RESPONSIBILITY_ID -- R 中RESPONSIBILITY_ID 無索引(只有56個不同值),RESP_APPL_ID無索引
AND R.RESP_APPL_ID = RSP.APPLICATION_ID ---(只有16個不同值) , RSP 中 APPLICATION_ID與RESPONSIBILITY_ID 聯合索引
AND RSP.LANGUAGE = USERENV ('LANG')
AND F.FORM_APPL_ID = FRM.APPLICATION_ID --- F 表FORM_APPL_ID 與FORM_ID 聯合索引
AND F.FORM_ID = FRM.FORM_ID --- FRM 表中 FORM_APPL_ID 與FORM_ID 聯合唯一索引
AND FRM.LANGUAGE = USERENV ('LANG')
AND F.AUDSID = S.AUDSID --- F 表中AUDSID 有索引
) a
group by a.inst_id ;
其中中間的select 是一個view, 這裡把它展開 。
這種SQL 優化如何下手 ? Index scan , full table scan , 表連線 , 還是Cost ??
(
SELECT L.USER_ID, R.RESP_APPL_ID, R.RESPONSIBILITY_ID, F.AUDSID,S.SID,
USR.USER_NAME, RSP.RESPONSIBILITY_NAME, FRM.USER_FORM_NAME, S.INST_ID
FROM FND_RESPONSIBILITY_TL RSP, -- 3188 rows
FND_FORM_TL FRM, -- 8992
FND_USER USR, -- 39400
FND_LOGINS L, -- 510000
FND_LOGIN_RESPONSIBILITIES R, --- 280000
FND_LOGIN_RESP_FORMS F, --- 1120000
GV$SESSION S --- VIEW 300
WHERE R.LOGIN_ID = F.LOGIN_ID
AND R.LOGIN_RESP_ID = F.LOGIN_RESP_ID -- R, F 表中 LOGIN_ID , LOGIN_RESP_ID 聯合索引
AND L.LOGIN_ID = R.LOGIN_ID --- L 表中 LOGIN_ID 唯一索引
AND L.END_TIME IS NULL ----- L 表中 END_TIME is NULL 為 38萬
AND R.END_TIME IS NULL ----- R 表中 END_TIME is NULL 為 10 萬
AND F.END_TIME IS NULL ----- F 表中 END_TIME is NULL 為 12 萬
AND L.USER_ID = USR.USER_ID -- L, USR 表中 USER_ID 存在索引 , USR中是唯一的 。
AND R.RESPONSIBILITY_ID = RSP.RESPONSIBILITY_ID -- R 中RESPONSIBILITY_ID 無索引(只有56個不同值),RESP_APPL_ID無索引
AND R.RESP_APPL_ID = RSP.APPLICATION_ID ---(只有16個不同值) , RSP 中 APPLICATION_ID與RESPONSIBILITY_ID 聯合索引
AND RSP.LANGUAGE = USERENV ('LANG')
AND F.FORM_APPL_ID = FRM.APPLICATION_ID --- F 表FORM_APPL_ID 與FORM_ID 聯合索引
AND F.FORM_ID = FRM.FORM_ID --- FRM 表中 FORM_APPL_ID 與FORM_ID 聯合唯一索引
AND FRM.LANGUAGE = USERENV ('LANG')
AND F.AUDSID = S.AUDSID --- F 表中AUDSID 有索引
) a
group by a.inst_id ;
其中中間的select 是一個view, 這裡把它展開 。
這種SQL 優化如何下手 ? Index scan , full table scan , 表連線 , 還是Cost ??
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-714950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL語言基礎(多表連線)SQL
- postgresql連線失敗如何處理SQL
- linux如何處理多連線請求?Linux
- 如何處理 Web 圖片優化?Web優化
- 【學習】SQL基礎-006-多表連線查詢SQL
- SQL優化之多表關聯查詢-案例一SQL優化
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- Mybatis連線池_動態sql語句_多表查詢實現MyBatisSQL
- Netty是如何處理新連線接入事件的?Netty事件
- mysql如何處理億級資料,第一個階段——優化SQL語句MySql優化
- SQL連線查詢優化[姊妹篇.第五彈]SQL優化
- 學習tomcat-如何建立連線,處理請求Tomcat
- LEFT JOIN 和JOIN 多表連線
- 行連線的處理方式指引
- windows 處理bat連線本地mysqlWindowsBATMySql
- MySQL表連線及其優化MySql優化
- 百億級資料處理優化優化
- 前端優化之高併發處理前端優化
- 【資料庫】查詢優化之子連線優化資料庫優化
- 分散式 | 資料庫連線如何正確處理 TCP 連線三次握手失敗分散式資料庫TCP
- Oracle SQL處理OracleSQL
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- SQL Server如何判斷哪些會話/連線是長連線?SQLServer會話
- SQL實戰從在職到離職(1) 如何處理連續查詢SQL
- Spark SQL:實現日誌離線批處理SparkSQL
- 如何優雅處理前端異常?前端
- 如何優雅的處理異常
- sql 內連線和外連線SQL
- nodejs 連線 mysql 查詢事務處理NodeJSMySql
- 資料庫連線異常處理思路資料庫
- JDBC連線批量處理資料入庫JDBC
- 【SQL】Oracle SQL處理的流程SQLOracle
- vnc遠端連線黑屏,vnc連線Linux後黑屏的處理辦法VNCLinux
- Mysql優化系列之——優化器對子查詢的處理MySql優化
- 羅景:連線效率優化實踐優化
- 如何優雅地處理前端異常?前端
- async/await 如何優美的處理異常?AI
- 修改windows遠端桌面連線埠-批處理Windows
- 遠端連線錯誤程式碼及處理