多表連線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優化索引
- SQL語言基礎(多表連線)SQL
- Sql Server系列:多表連線查詢SQLServer
- SQL複雜查詢多表連線SQL
- Oracle優化器內部處理的表連線方式Oracle優化
- sql server連線排序衝突處理SQLServer排序
- Jdbc引入連線池,JdbcTemplate處理結果集的優化JDBC優化
- postgresql連線失敗如何處理SQL
- 多表的連線
- 如何處理 Web 圖片優化?Web優化
- linux如何處理多連線請求?Linux
- SQL Server 連線常見錯誤及其處理方法SQLServer
- 【SQL 效能優化】表的三種連線方式SQL優化
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL優化之多表關聯查詢-案例一SQL優化
- 多表外連線的使用
- 【學習】SQL基礎-006-多表連線查詢SQL
- 用push_subq優化批處理統計SQL優化SQL
- LEFT JOIN 和JOIN 多表連線
- 【janes】多表查詢 外連線
- 熱點塊處理是首先應該處理物件呢?還是優化sql。物件優化SQL
- Netty是如何處理新連線接入事件的?Netty事件
- Mybatis連線池_動態sql語句_多表查詢實現MyBatisSQL
- SQL連線查詢優化[姊妹篇.第五彈]SQL優化
- mysql如何處理億級資料,第一個階段——優化SQL語句MySql優化
- 處理方塊之間的連線線
- windows 處理bat連線本地mysqlWindowsBATMySql
- 行連線的處理方式指引
- 學習tomcat-如何建立連線,處理請求Tomcat
- 【ITOO】--SQL資料庫優化:切割、資料庫連線池SQL資料庫優化
- MySQL表連線及其優化MySql優化
- Redo Gap 處理與優化優化
- 【資料庫】查詢優化之子連線優化資料庫優化
- SSH 連線緩慢問題處理
- asp連線Mysql及編碼處理MySql
- 連線條件是兩個欄位“or”關係的SQL優化SQL優化
- MySQL學習筆記之多表連線MySql筆記
- 分散式 | 資料庫連線如何正確處理 TCP 連線三次握手失敗分散式資料庫TCP