如何提高向数据库批量插入记录的速度? ( 积分: 20 )

  • 主题发起人 主题发起人 gojohnnywong
  • 开始时间 开始时间
G

gojohnnywong

Unregistered / Unconfirmed
GUEST, unregistred user!
以下语句是将listbox里的记录批量的插入到表里,当listbox的记录数达到一千几百的时候,程序的处理速度非常慢,好像将系统的资源都用尽了,其他的应用程序(例如打开网页等都很慢),请问有什么方法可以提高程序的处理速度? 代码如下:

opensql:='select mxlb as lb from T_SYS_CSMX where mxmc='''+trim(combobox2.Text)+'''';
try
if pubquery.Active then pubquery.Close;
pubquery:=openquery(opensql,psession); //执行sql语句
except
showmessage('操作失败!');
end;
ii:=pubquery.FieldByName('lb').AsVariant;
for i := 0 to ListBox1.Count - 1 do
begin
exsql:= 'Insert into T_TMP_TAB1(YJTM,SJJ,FFRQ,BC,JSZBH,FDCZY) Values('+QuotedStr(ListBox1.Items)+','''+inttostr(ii)+''',to_char(sysdate,'+''''+'YYYY-MM-DD'+''''+'),'''+trim(Edit1.Text)+''','''+trim(Edit16.Text)+''','''+xtcs.srybh+''')';
try
execsql(exsql,psession);//执行sql语句
except
showmessage('操作失败!');
end;
end;
 
以下语句是将listbox里的记录批量的插入到表里,当listbox的记录数达到一千几百的时候,程序的处理速度非常慢,好像将系统的资源都用尽了,其他的应用程序(例如打开网页等都很慢),请问有什么方法可以提高程序的处理速度? 代码如下:

opensql:='select mxlb as lb from T_SYS_CSMX where mxmc='''+trim(combobox2.Text)+'''';
try
if pubquery.Active then pubquery.Close;
pubquery:=openquery(opensql,psession); //执行sql语句
except
showmessage('操作失败!');
end;
ii:=pubquery.FieldByName('lb').AsVariant;
for i := 0 to ListBox1.Count - 1 do
begin
exsql:= 'Insert into T_TMP_TAB1(YJTM,SJJ,FFRQ,BC,JSZBH,FDCZY) Values('+QuotedStr(ListBox1.Items)+','''+inttostr(ii)+''',to_char(sysdate,'+''''+'YYYY-MM-DD'+''''+'),'''+trim(Edit1.Text)+''','''+trim(Edit16.Text)+''','''+xtcs.srybh+''')';
try
execsql(exsql,psession);//执行sql语句
except
showmessage('操作失败!');
end;
end;
 
具体慢到什么 地步
 
一个建议,不知道行不行,SQL server和oracle这些比较大的数据库系统都是支持多句执行的,你只要确保SQL没有问题,看看能不能通过先把SQL组合起来,然后执行一次execsql,不用每次都执行,中间用分号隔开就可以了


for i := 0 to ListBox1.Count - 1 do
begin
exsql:=exsql + ';Insert into T_TMP_TAB1(YJTM,SJJ,FFRQ,BC,JSZBH,FDCZY) Values('+QuotedStr(ListBox1.Items)+','''+inttostr(ii)+''',to_char(sysdate,'+''''+'YYYY-MM-DD'+''''+'),'''+trim(Edit1.Text)+''','''+trim(Edit16.Text)+''','''+xtcs.srybh+''')';
end;

try
execsql(exsql,psession);//执行sql语句
except
showmessage('操作失败!');
end;
然后就是检查execsql了,是不是频繁开关,一个建议,看看有帮助没有
 
每执行一次加一行Application.processmessage;这样系统不会造成像死机一样
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=8983
作者?: 浪子阿开
标题?: 如何高效的插入几万条记录
关键字:
分类?: 个人专区
密级?: 公开
(评分: , 回复: 1, 阅读: 220) »»
抄来的:
我在msSQL上面用存储过程插入10000条大概在一秒钟左右
代码如下,给你参考一下。
 
我在做串口的时候都是采用SendMessage,如果用PostMessage的话有时候消息根本收不到,或者死机一样,两个的区别就是要不要等结果的问题,所以斟酌一下
 
to chenybin:用 分号隔开的方法行不通,不能用分号分隔执行sql语句
martinwang :Application.processmessage 应该放在哪里?为什么程序执行提示“不能识别 Application”
 
1、我在SQL Server和Orcale里面都可以,但是ACCESS就不行

2、Application和Printer以及Screen都是全局变量,程序一起来就有了
 
to chenybin : 我用oracle的,不能用分号分隔执行sql语句。
加了Application.processmessage 后对程序的运行速度没多大提高!
 
你的是BDE还是ADO呀?
 
是用ADO连吗?在SQL PLUS里面可以直接运行一个脚步文件,里面有很多sql语句,没有问题,说明可以这样执行
 
使用 oracle access 的控件
 
用多线程处理
新开一个线程来插入数据
 
你慢的根源在于在循环中执行SQL语句,还没用事务!
建议加上事务,进行批量更新,速度应当快很多。
 
后退
顶部