使用DBLink出现ora-03113处理过程

今天碰到一个数据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、升级数据库版本
请使用浏览器的分享功能分享到微信等