今天碰到一个数据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、升级数据库版本