有个上千万条数据复制怎么处理呀?(0分)

  • 主题发起人 主题发起人 快乐男生
  • 开始时间 开始时间

快乐男生

Unregistered / Unconfirmed
GUEST, unregistred user!
我用BatchMove,但是它要一个BDEDataSet,我用的TQuery1,我用select * from table,因为数据太大了,还没有打开,程序就死了...我用TAdoquery,当然也是一样的,急死我了,这类问题怎么处理呀!
 
一条一条复杂。不会的化去请教一下 asp 人员对数据库操作
 
可以这样,不一起复制。
将其分成N段来复制。
select top 10 from table
第二次复制20条,第三次复制30条。
这样你还可以加个进度条,来看复制了多少条记录了。
 
直接追加到另外一个表要快的多呀
 
怎么没有好的解决办法呢?
 
不知道你的具体情况,不过通用的方法其实就是分段取,分段拷贝。

你这么大的表,肯定有一个唯一索引的吧,不管是流水号之类的字段,还是日期字段。你完全可以用个循环来分段取数据,再拷贝过去吧。

select * from XXX where 序列号 >= 0 and 序列号 <= 10000
select * from XXX where 序列号 >= 10001 and 序列号 <= 20000
……
 
这个思路很不错
 
怎么解决呀
 
说到这么清楚了,还不行吗?
 
不会用TBatchMove??看好了:
首先TQuery不用事先打开!
其次,可以采用BatchMove.CommitCount来控制多少个记录提交一次!!
 
分段取,分段拷贝, 最后用_ReocordSet来做,有效率点。
 
try
Database2 := TDatabase.create(nil);
with Database2 do
begin
Params.Clear;
Database2.AliasName := 'mytest';
Database2.DatabaseName := 'Database2';
Database2.Params.Add('USER NAME=system');
Database2.Params.Add('Password=system');
Database2.LoginPrompt := false;
Database2.Connected := true;
end;
Form1.Query1.DatabaseName := 'Database2';
Form1.Table1.DatabaseName := 'Database2';
Form1.Query1.Active:= false;
Form1.Query1.SQL.Clear;
if i <= j then
str :='select failure_id,srvtrace_id from t_cc_failure_claim where (failure_id >=' + inttostr(i) + ') and (failure_id < ' + inttostr(i+100) + ')'
else
str := 'select failure_id,srvtrace_id from t_cc_failure_claim where (failure_id >=' + inttostr(i) + ') and (failure_id <= ' + inttostr(j) + ')';
Form1.Query1.SQL.Add(str);
Form1.Query1.Active := true;
//Table1.Active := true;

Form1.Table1.Open;

BatchMove1 := TBatchMove.Create(nil);
BatchMove1.Source := Form1.Query1;

try
BatchMove1.Source := form1.Query1;
BatchMove1.Destination := Form1.Table1;
BatchMove1.Mappings.Clear;
BatchMove1.Mappings.Add('failure_id=failure_id') ;
BatchMove1.Mappings.Add('srvtrace_id=srvtrace_id');
BatchMove1.Execute;
//form1.Database2.CloseDataSets;
finally
BatchMove1.Free;
end;
l:= l+ Form1.Query1.recordcount;
Form1.label2.Caption := inttostr(l) ;
Form1.Query1.Close;
Form1.Table1.Close;
finally
Database2.CloseDataSets;
Database2.Close;
Database2.Free;
end;
BatchMove有内存泄露问题,我数据多了就报内存不足,就是 Database2.Connected := true;
调出来的
 
用ado连数据库 使用opendatasource语句解决
ps:bde不支持opendatasource语句
 
后退
顶部