Oracle至Sql Server用DB Link查询缓慢原因之一

本文描述了一个跨数据库同步进程的问题排查及解决方案。该进程用于从Oracle数据库通过DBlink获取SqlServer中的新增数据,但在运行过程中遇到了执行速度缓慢及频繁报错的情况。文章详细介绍了排查过程中的各种尝试与最终找到的根本原因——数据类型转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司系统有一个每日同步进程,从A系统数据库(Oracle 11g)提取B系统数据库(Sql Server 2005)每天新增的数据,实现的方法为:在A数据库中建立物理视图,来通过DBlink引用B数据库中的数据源,A系统每天对该视图中的数据做提取。

进程跑了一年多没出问题,只是执行速度较慢,从最初的半个小时左右,到了最近的1个小时左右,再到最近的频频报错;

开始是认为数据量过大,看到网上有帖说 同样是建了物理视图,随着数据量增大出现了与我同样的错误,解决方法是,重建DBlink,需要注意细节将密码用“”引起来。照做后,第二天依然看到有报错;

于是将B数据库的数据转移,从200多W行清到了10W行,并检查了B中的索引,但无效果,依然很慢且有时报错;

模拟进程执行的代码,我在A中用DBlink查询B的前20条(rownum<=20)用了1.5秒,插入着20条用了10多秒,改成rownum<=60插入60条用时30多秒,基本确定是insert效率低下导致速度慢;同时 我也发现A表的唯一索引与B表不一致,插入条件中有not exists的判断,这也会影响insert效率。将A表索引与B表一致后,想到A数据库的数据量也随着时间增大,有几百W条,果断削掉了一半,又重建了索引。结果依然报错;

联想到之前有取消过进程,并且出现过两个进程同时运行,怀疑是有事务锁影响,经过清理后,正常运行了一两天,再次出现报错;

此时在PL SQL Developer登陆A查B的数据,有个奇怪的现象,前几十行可以较轻松的查出来,但若超过100行,软件都会卡住,偶尔不卡也会报错;但查询B另外一个表,没有卡顿,且几百行数据也可以轻松刷出。

最后经过Google得知这样一个细节,通过gateways创建DBlink到sqlserver,若有varchar(30)类型,getways会将其定义为varchar2(30),经过转化后长度会变大,可能会超过长度,此时转换肯定也要消耗资源,于是把SQL Server中的varchar(20)改成了nvarchar(20),一切都正常了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值