使用DBLink出現ora-03113處理過程

mahanso發表於2012-08-16
今天碰到一個資料oracle9i,dblink到另一個資料庫,dblink單表查詢時候沒有問題SELECT * FROM XX.RES_EQUIP_HIS@AAA,但是執行聯合查詢時候
SELECT * FROM XX.RES_EQUIP_HIS@AAA A,
         XX.CM_USER_EQPT            B
   WHERE  A.SALE_DATE BETWEEN
         to_date(to_number(to_char(sysdate, 'yyyymmdd')) - 1 || '000000','yyyymmddhh24miss') AND
         to_date(to_number(to_char(sysdate, 'yyyymmdd')) - 1 || '235959','yyyymmddhh24miss')AND 
         A.PHONE_SEQUENCE = B.EQPT_SN;
         
返回錯誤:ORA-03113: 通訊通道的檔案結束。

當我遇到這個問題,感覺像網路問題,我首先檢視了2表的描述和2張表上的索引,A.PHONE_SEQUENCE和B.EQPT_SN都有索引,A.SALE_DATE也有索引。

有時dblink查詢的時候報ORA-03113,不能檢視執行計劃,我做了2個測試。

一、單獨執行:

SELECT * FROM XX.RES_EQUIP_HIS@AAA A
   WHERE  A.SALE_DATE BETWEEN
         to_date(to_number(to_char(sysdate, 'yyyymmdd')) - 1 || '000000','yyyymmddhh24miss') AND
         to_date(to_number(to_char(sysdate, 'yyyymmdd')) - 1 || '235959','yyyymmddhh24miss');
可以執行成功。

二、單獨執行:
SELECT * FROM XX.RES_EQUIP_HIS@AAA A,
         XX.CM_USER_EQPT            B
   WHERE A.PHONE_SEQUENCE = B.EQPT_SN;

可以執行成功

我判斷應該是to_date(to_number(to_char(sysdate, 'yyyymmdd')) - 1 || '000000','yyyymmddhh24miss')沒有走索引導致。

我又測試了下面sql:
   SELECT count(*) FROM XX.RES_EQUIP_HIS@AAA A,
         XX.CM_USER_EQPT            B
   WHERE  A.PHONE_SEQUENCE = B.EQPT_SN 
   and A.SALE_DATE >= to_date('20120815000000','yyyymmddhh24miss') 
   AND A.SALE_DATE < to_date('20120815235959','yyyymmddhh24miss');
   
執行成功。

所以判斷,問題出在由於之前A.SALE_DATE沒有做索引,查詢的資料量太大了,有可能導致網路諸塞,引起 03113

總結:出現ora-03113解決方法:
1、減少查詢資料的量或者正確使用索引
2、升級資料庫版本

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12272958/viewspace-741186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章