VIEW和SYNONYM引起的執行計劃的異常
最近在分析一個財務系統(Oracle EBS)的SQL執行計劃時,發現一個有意思的事情。SQL是這樣的:
SELECT int.ROWID, ... FROM GL_INTERFACE INT, gl_code_combinations flex_cc, gl_code_combinations ccid_cc WHERE int.set_of_books_id = 1001 AND int.status != 'PROCESSED' AND (int.user_je_source_name, GROUP_ID) IN ( ('精算', 119850)) AND flex_cc.SEGMENT1(+) = int.SEGMENT1 AND flex_cc.SEGMENT2(+) = int.SEGMENT2 AND flex_cc.SEGMENT3(+) = int.SEGMENT3 AND flex_cc.SEGMENT4(+) = int.SEGMENT4 AND flex_cc.SEGMENT5(+) = int.SEGMENT5 AND flex_cc.SEGMENT6(+) = int.SEGMENT6 AND flex_cc.SEGMENT7(+) = int.SEGMENT7 AND flex_cc.SEGMENT8(+) = int.SEGMENT8 AND flex_cc.chart_of_accounts_id(+) = 50268 AND flex_cc.template_id(+) IS NULL AND ccid_cc.code_combination_id(+) = int.code_combination_id AND ccid_cc.chart_of_accounts_id(+) = 50268 AND ccid_cc.template_id(+) IS NULL ORDER BY ...;原SQL比較長,所以省略掉了一些不重要的細節。這是一個帳目匯入的SQL,表GL_INTERFACE和gl_code_combinations是GL下的兩張表,而SQL是由APPS呼叫的,在APPS下建有該兩張表的VIEW。正確的執行計劃應該是這樣的:
----------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 33717 | 14M| | 27731 (1)| 00:05:33 | | 1 | SORT ORDER BY | | 33717 | 14M| 16M| 27731 (1)| 00:05:33 | | 2 | NESTED LOOPS OUTER | | 33717 | 14M| | 24454 (1)| 00:04:54 | |* 3 | HASH JOIN OUTER | | 33717 | 11M| 9688K| 24453 (1)| 00:04:54 | |* 4 | TABLE ACCESS FULL | GL_INTERFACE | 33717 | 9285K| | 1039 (1)| 00:00:13 | |* 5 | TABLE ACCESS FULL | GL_CODE_COMBINATIONS | 2758K| 231M| | 9873 (2)| 00:01:59 | |* 6 | TABLE ACCESS BY INDEX ROWID| GL_CODE_COMBINATIONS | 1 | 88 | | 1 (0)| 00:00:01 | |* 7 | INDEX UNIQUE SCAN | GL_CODE_COMBINATIONS_U1 | 1 | | | 1 (0)| 00:00:01 | -----------------------------------------------------------------------------------------------------------------但是APPS跑的執行計劃就是不對:
----------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 337 | 150K| 1721 (1)| | 1 | SORT ORDER BY | | 337 | 150K| 1721 (1)| | 2 | NESTED LOOPS OUTER | | 337 | 150K| 1720 (1)| | 3 | NESTED LOOPS OUTER | | 337 | 121K| 1046 (2)| |* 4 | TABLE ACCESS FULL | GL_INTERFACE | 337 | 95034 | 1045 (2)| |* 5 | TABLE ACCESS BY INDEX ROWID| GL_CODE_COMBINATIONS | 1 | 88 | 1 (0)| |* 6 | INDEX UNIQUE SCAN | GL_CODE_COMBINATIONS_U1 | 1 | | 1 (0)| |* 7 | TABLE ACCESS BY INDEX ROWID | GL_CODE_COMBINATIONS | 1 | 88 | 2 (0)| |* 8 | INDEX RANGE SCAN | GL_CODE_COMBINATIONS_N4 | 1134 | | 2 (0)| -----------------------------------------------------------------------------------------------一番研究後,有意思的事情發生了,我用DBA帳號執行該SQL,如果表之前加上GL,即:
FROM GL.GL_INTERFACE INT, GL.gl_code_combinations flex_cc, GL.gl_code_combinations ccid_cc執行計劃就是正確的,而如果表之前使用APPS,即:
FROM APPS.GL_INTERFACE INT, APPS.gl_code_combinations flex_cc, APPS.gl_code_combinations ccid_cc就使用錯誤的執行計劃。因APPS下在這兩表上的VIEW就只是簡單對這兩張表的引用,所以把VIEW改成了SYNONYM,然後執行計劃就正確了。其中的原因還在探究中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13885898/viewspace-1651373/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- Oracle 變數窺視引起執行計劃異常故障分析Oracle變數
- Oracle資料遷移後由列的直方圖統計資訊引起的執行計劃異常Oracle直方圖
- Oracle 9i變數窺視引起執行計劃異常故障報告Oracle變數
- Oracle 'or exists/in'結合使用引起的filter執行計劃 的優化OracleFilter優化
- Synonym_View_Materialized和Public物件ViewZed物件
- 異常-編譯期異常和執行期異常的區別編譯
- 執行時異常和檢查性異常區別
- mongodb 常見運維監控和執行計劃MongoDB運維
- 10g和9i執行計劃差異
- sql執行計劃變更和刪除快取中執行計劃的方法SQL快取
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- _complex_view_merging對執行計劃的影響View
- SQL的執行計劃SQL
- 執行計劃的理解.
- MySQL案例-並行複製亂序提交引起的同步異常MySql並行
- 索引失效系列——統計量過期引起執行計劃錯誤索引
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- 分析執行計劃最佳化SQLORACLE的執行計劃(轉)SQLOracle
- Oracle 索引和執行計劃Oracle索引
- mysql索引和執行計劃MySql索引
- 聚簇因子和執行計劃的聯絡
- 執行計劃-1:獲取執行計劃
- 執行ArrayList的remove(object)方法拋異常?REMObject
- 生成執行計劃的方法
- TiDB與MySQL的SQL差異及執行計劃簡析TiDBMySql
- DB優化小常識 - 執行計劃中Cardinality的計算優化
- AWR報告的收集和分析執行計劃的方式
- 執行緒池OOM異常執行緒OOM
- 程式執行異常: Modulo by zero
- Oracle 執行計劃中access 和 filter的區別OracleFilter
- 執行計劃
- 異常執行緒的相關複習(前)執行緒
- Java中Error和Exception的異同以及執行時異常(Runtime exception)與檢查型異常(checked exception)的區別JavaErrorException
- sqm執行計劃的繫結
- SqlServer的執行計劃如何分析?SQLServer