当前位置:数据库 > SQLServer >>

请有经验的DBA进来回答一下,sqlserver大批量数据迁移问题

我要把数据从sqlserver迁移到oracle,需要通过程序转换,但是现在sqlserver中有5亿多的数据,服务器的性能也只是一般(无法更换),其中有1.5亿的数据是可以删除的,但是现在删除和查询都遇到瓶颈了。删除和查询都比较慢,基本10分钟才能删一个id号,查询也要10分钟左右,但是我有15000个ID,该表的索引是联合索引,id,insertDate,name
追问:做这个的目的是将原来的5亿数据转换成15000个分表,讲所有的数据根据ID分别存在不同的表中。,代码的作用实行数据转换的意思是比如读出来的state是1 我需要通过算法转换成其他的值,类似这样的。你说的数据导出来成一个或者一系列的文件我理解其中的意思,但是具体要怎么做呢?请指教!首先  你说的很好,但是我有个疑问,目前我最大的瓶颈就是查询速度慢的问题,即使使用工具到处txt文件,也是需要依赖于sql查询的功能,在这一步我就已经卡住了。。。进行不下去了没有分区,请问怎么并行啊,我是通过java用ibatis和spring做的,主要的目的是查询,平均一个iD有5W左右的数据,但是现在的瓶颈就是查询慢,所以我才想到删除这条路的。先删除没必要的数据再查询。本来的方案是直接查询,结果由于数据过多,采用先删除没必要的数据的方案,但是用java现在起了5个线程,一起操作数据库,数据库会卡在那很长时间。请问有什么好办法么?如果不删除直接查询也可以,但是效率也比较低也可以不删除的,但是可以告诉我怎么进行多进程并发么,这里用的是进程,而我用的是线程,请问哪个好呢?可以麻烦给我一个详细的方案么?提醒一下:查询遇到瓶颈,查询不动,所有联合索引都用上了
答案:1   不需要的数据当然删除最好  减轻压力。
    1) 删除前先删除索引。因为删除的同时也需要对索引进行维护。我们先删除索引再删除数据效率会有一点提高
    2) 删除完数据后,再重新创建索引。为数据转换做准备。

2   数据转换过程
    1)不知道你是如何实现的。我推荐的方法是将数据导出来成一个或者一系列的文件。
    2)再将导出的文件导入到oracle中。可能需要进行数据类型等的转换。
我的想法就是将你的所有动作分解,一个个完成。这样出问题也能及时解决,而且互不影响。如果从sqlserver导出数据的同时还需要往sqlserver中插入数据,那么我推荐插入的数据放入一个新表中,最后将这个新表的数据也导出来再导入。

3   导入到oracle数据库中。
    1)做好详细规划。删除不必要的数据大概还有接近4亿行。oracle中的表是否要做分区等?
    2)数据导入后再在表上建索引。
其他:表有没有做分区?
如果有分区的话,可以一个分区一个分区的做。
如果没分区的话,可以用并行。
还有,删除时,可以把删除的查询条件中没用到的索引disable掉。 平均每个id号大概多少数据?
确认一下你的语句执行计划走没走索引。
既然已经要清理数据,那甬余的索引,主键都可以drop掉。会提高dml效率。
数据迁移常用的办法就是多进程并发。
根据你性能,起10-20或者更多的进程,同时执行。

对了。想起来个问题,你为什么要删除数据呢?直接在程序转换的过程中通过where条件过滤掉这些数据不是更好么? 和电话费认同和 insertDate, 给你换个思路:在SQLserver中,建立一个存储过程,根据你的算法,把数据分散到15000个数据表中,建表和insert全都在存储过程中完成
这样就没有大数据显示占用内存的问题了,等几个小时,应该就能完成转换
然后你再对小表进行操作,迁移到oracle中,因为表中数据少,所以速度就非常快了,你看这样行吗? 

上一个:在sqlserver2000 里面,不用游标,如何将查询出来的表 的每一行的某一个列循环打印出来?求高手指点
下一个:sqlserver中存储过程的参数可以有out和output,他们有什么区别?

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,