关于数据复制,请名位高手帮忙解决一下这个问题小弟不甚感激
我现在在做一个数据迁移的模块,就是将一个库中的数据导入另一个库中,为了说明情况用A
代表源库,B代表目标库,
A库和B库中的表结构不一样,在A库向B库导数据中需要进行一些数据转换,如字符转为数据值型之类的也可以是个算术表达式,现在一切工作都做好了数据也可以导进去了,
但遇到一个大问题就是速度慢的问题,
我的环境是delphi5.0+ado+oracle8.17
在进行转换时是这样的用TADOQuery将源表打开(在这里用户可以随意设置查询条件)
对源表进行循环再对映射好的每一个字段循环对需要进行数据转换或计算的字段求出结果后再赋给目标表的每一个字段,每条记录POST一下,然后是一张表一个事务,但这样速度太慢了,
刚开始还可以但越往后越慢,上了一千多条那速度就不能忍受了,但我的源库中的十几张表都是几十万或十几万条呀,请名位帮忙给个见议,小弟不甚感激
问题很急在线等待佳音
问题点数:100、回复次数:12Top
1 楼jingbianfc(『静⊙变』)回复于 2003-12-01 12:33:37 得分 20
如果一条一条的处理,你用BDE的TABLE还快些
如果用你ADO,你就是ADOCOMMAND吧,再在SQL和ADO的相关方面做些优化
或者你可以尝试DBX访问
我的看法,仅供参考:)Top
2 楼xjdelphiuser(石头)回复于 2003-12-01 12:36:40 得分 0
DBX是什么,小弟初来扎道,请赐教;Top
3 楼zenwin(zenwin)回复于 2003-12-01 12:40:32 得分 20
这样肯定慢了, 在操作目的表时,就不用打开了, 直接写语句, insert/ update ,这样执行起来要快很多的Top
4 楼xjdelphiuser(石头)回复于 2003-12-01 12:58:10 得分 0
用SQL语句有很多弊端,因为两第表的构不同不能用INSERT INTO TABLE1(FIELD1,...FIELDN) SELECT * FROM TABLE2;
只有把每个字段的值得到以后再凑成INSERT语句,这样一来如果一个字段中的类型是字符型而且字段的值中带有一个单引号,就不行了,是吧?所以这不是一个好的方法;
而且如果源表中字段的类型是BLOB或LONG等类型的就不能凑成SQL语句了;Top
5 楼qybao(阿宝)回复于 2003-12-01 13:15:14 得分 10
可以试试用batchmove
一般数据库备份,数据迁移什么的用batchmove比较方便
Top
6 楼xjdelphiuser(石头)回复于 2003-12-01 16:07:34 得分 0
还有没有其它的办法呀,Top
7 楼cjfzy(他山之石,可以攻玉。)回复于 2003-12-01 16:31:21 得分 10
A和B在同一台机器上吗?慢可能是因为网络慢。因为网络每次把A的东西拿到程序执行机器上,再传到B所在的机器上!Top
8 楼HiMrXia(快乐每一天)回复于 2003-12-01 16:38:09 得分 25
先将整理好的A数据插入一个TClientDataSet,该DataSet不要和B保持联接,其中只有表结
构,等程序将所有整理后的A数据都插入DataSet后,统一更新至B,千万不要一条一条的提交Top
9 楼xjdelphiuser(石头)回复于 2003-12-01 17:10:10 得分 0
to cjfzy(他山之石,可以攻玉。) 网络没有问题;
to HiMrXia(快乐每一天) 我没有一条一条的提交,我是每隔500条数据提交一次,你的方法我试一下:)
Top
10 楼xjdelphiuser(石头)回复于 2003-12-01 18:01:23 得分 0
我看了一下,好像用_RECORDSET,可以提高不少速度,有谁用过它的呀?Top
11 楼xtascf(风中之峰)回复于 2003-12-01 18:47:34 得分 10
你可以用batchmove.append的方法,你最好先看一下有关tbachmove的相关资料,你就会感觉很简单了。Top
12 楼haacat(哈)回复于 2003-12-01 20:18:00 得分 5
batchmove是个不错的选择!
可以值得一试哦!!!
Top




