有谁能优化加速下列程序?(100分)

  • 主题发起人 主题发起人 soarsoft
  • 开始时间 开始时间
S

soarsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
while not table2.Eof do
begin
query1.SQL.Clear;
query1.SQL.Add('select * from hy where kh=:vkh');
query1.ParamByName('vkh').AsString:=table2.fieldbyname('kh').AsString;
query1.Open;
if query1.IsEmpty then
begin
table1.Append;
table1.FieldByName('id').AsString:=table2.FieldByName('id').AsString;
table1.FieldByName('kh').AsString:=table2.FieldByName('kh').AsString;
table1.FieldByName('xm').AsString:=table2.FieldByName('xm').AsString;
table1.FieldByName('xb').AsString:=table2.FieldByName('xb').AsString;
table1.FieldByName('sfz').AsString:=table2.FieldByName('sfz').AsString;
table1.FieldByName('dh').AsString:=table2.FieldByName('dh').AsString;
table1.FieldByName('sj').AsString:=table2.FieldByName('sj').AsString;
table1.FieldByName('add').AsString:=table2.FieldByName('add').AsString;
table1.FieldByName('bksj').AsDateTime:=table2.FieldByName('bksj').AsDateTime;
table1.FieldByName('hysr1').AsString:=table2.FieldByName('hysr1').AsString;
table1.FieldByName('jf').AsString:=table2.FieldByName('jf').AsString;
table1.FieldByName('zy').AsString:=table2.FieldByName('zy').AsString;
table1.FieldByName('yyl').AsString:=table2.FieldByName('yyl').AsString;
end;
table2.Next;
end;
table1.ApplyUpdates;
table1.CommitUpdates;
//目的:table1指向hy库
table2循环
用query1查找另一个表hy中kh与table2中的kh相同的记录
如果query1空说明没有
table1中加入table2当前记录
 
使用这样的sql来作。
insert kh select hy.* from hy where not(hy.kh in (select kh from kh))
 
使用这样的sql来作。
insert kh select hy.* from hy where not(hy.kh in (select kh from kh))
 
in 会使速度很慢
 
in 不一定慢,主要看后面的结果集大小,小的话,in和exists没什么区别,大的话还是用exists.如果超过上千的话,用exists.
 
感谢。我的意思没表达清:请大家帮我写一段程序。要注速度要快:
table1与table2结构相同.把table2中最新记录加到table1中。字段kh相同的记录把字段jf更新.
 
感谢。我的意思没表达清:请大家帮我写一段程序。速度要快:
table1与table2结构相同.把table2中最新记录加到table1中。字段kh相同的记录把字段jf更新.
 
两个点可以进行优化:
1.Query用作判断是业务需求,但是每次都去查询一次,和数据库进行交互会消耗很多CPU,可以使用一次查询
Select kh from hy where group by kh
然后在循环中,使用Locate查询(kh, table2.fieldbyname('kh').AsString),如果找到,则表明有,否则无.
2.FieldByName的优化.如果while循环次数很多(比如10000),且字段很多,我进行过测试,FieldByName可以消耗大概4秒时间.可以考虑在循环之前,记下两边的Field的映射Index配对.
如果两边结构一模一样,可以考虑使用类似下面的代码进行编写:
var
oFieldMaps: TIntegerDynArray;
// todo: BuildFieldMaps;
for J := 0 to Length(oFieldMaps) - 1 do
table1.Fields.Value:=table2.Fields[FieldMaps].Value;

因为FieldByName查找字段的时候是遍历Field列表,比较字段名称
 
1、
create table temptable as
select b.*
from tablea a,tableb b
where a.kh=b.kh
2、
delete tablea
where kh in
(
select kh
from temptable
)
3、
insert into tablea
select * from temptable
4、dorp table temptable --不一定要,和创建一致
 
请大家帮我写一段程序。速度要快:delphi7 database数据库 table1与table2结构相同.table2与table1的存在路径不同.(例:table1指向c:/a/1.dbf.table2指向c:/b/2.dbf)
要求:把table2中最新记录加到table1中。
字段kh相同的记录把table2的字段jf更新到table1中
 
我晕!是不是要 别人 完全写好 你才用啊!
别人都说了思路了,自己钻啊!
你的那种写法肯定慢了,当数据大的时候 ,象死机了一样!
 
赞同bmsr方法。结一个库表添加记录的方式很多,使用存储过程是个不错的选择,可以将bmsr的方法写成存储过程,如果你使用的是MySQL低版本,那么可以利用Delphi的ADO控件来完成。换个角度思考,也许你就会找到解决问题的办法。
 
笔误,可以使用Zeos Access控件。
 
后退
顶部