四时宝库

程序员的知识宝库

【Oracle移行到Sqlserver完美解决案】①Sqlserver内存溢出

因为项目的升级,数据库从oracle改到了sqlserver,这样带来的问题是需要做个移行工具,将Oracle的数据移植到Sqlserver,按照一般的想法,在sqlserver端建一个dblink,连接oracle,insert...select的方式进行数据插入,就解决了,但是事情没有那么简单,接下来将实现过程中遇到的问题,以及如何排雷,最终完美实现的过程说明下,我想对有这方面需求的朋友,一定有所帮助


背景:

小数据量的表,图形化的移行工具,不适合复杂的工厂环境,不在讨论范围。讨论大数据量表移行

有一个操作log表,数据600多万件,占内存3G多,从oracle中将操作log表中的数据,导入到Sqlserver的操作log表。服务器内存16G


案1:创建dblink,dblink..表名的方式访问

INSERT SqlServer表 Select * from OracleLink..LDBTLOGT 16G内存,处理了30万件时内存超了,现象就是内存一直增长,在剩余内存不多时,它会自动回收几次,但是最终还是会内存溢出

对于sqlserver数据库清内存是系统自己来做的,网上能看到的案是修改max server memory的值,都没法解决。另外修改max server memory的值需要重启SQLSERVER服务,实际的客户现场不太可能这么实现。Sqlserver这方面和Oracle还是没法比。

案2:dblink..表名的方式访问,每次插入件数指定

使用sqlserver offset,每1000件取一次,进行插入,没有改善,内存还是一直增长。原因在案3说明

案3:使用OPENQUERY代替OracleLink..的DBLink的使用方法

INSERT Sqlserver表 SELECT * FROM OPENQUERY(OracleLink,'select * from Oracle表)

OracleLink是dblink ,内存还是一直增长。

※这里说明下,为什么使用OPENQUERY代替OracleLink..,通过执行计划大家可以看到区别

使用OPENQUERY和OracleLink..的区别,OPENQUERY是直接连接远程的oracle数据库,OracleLink..是从oracle取回来,本地过滤,所以指定件数不起作用

案4:使用OPENQUERY,同时通过oracle的rownum对数据范围进行分割,每处理一次,内存能够释放,600万处理后,内存回收正常

INSERT INTO LDBTLOGT ( SELECT * FROM OPENQUERY(OracleLink,'select Oracle字段 FROM (SELECT Oracle字段,rownum num FROM LDBTLOGT) t2 WHERE t2.num between $BEGINNUM and $ENDNUM'))

通过案4,内存溢出的问题是解决了,接下来遇到执行时间太慢的问题,请继续关注


索引:

【Oracle移行到Sqlserver完美解决案】①Sqlserver内存溢出

【Oracle移行到Sqlserver完美解决案】②内存溢出时查看SQL

【Oracle移行到Sqlserver完美解决案】③执行时间改善案bcp+bulk insert

【Oracle移行到Sqlserver完美解决案】④sqluldr2+bulk 32H=>3H

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接