inset into 与 append的问题,各位高手指教了。

jjwang2004 2009-11-27 12:04:09


//方式一:
for i:=0 to 10000 do begin
with insertQry do begin
close;
sql.Clear;
sql.Add('insert into myTbl(mID) values(:mID)');
parameters.ParamByName('mID').Value:=i;
ExecSQL;
end;
end;

//方式二:
insertQry.ClearFields;
for i:=0 to 10000 do begin
insertQry.Append;
insertQry.FieldByName('mID').Value:=i;
end;
insertQry.Post;
//两者的处理速度是否基本相同,如果相同,post是否逐一进行数据新增还是类似于select into呢?


贴先发了,明天早上再来看!
...全文
197 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjwang2004 2009-12-16
  • 打赏
  • 举报
回复
不好意思了,忘这帖子了 - -!
wxsan 2009-12-03
  • 打赏
  • 举报
回复
倾向第二种方法
wooden954 2009-12-01
  • 打赏
  • 举报
回复
第一种方法在进行重复打开、关闭数据库组件,本身SQL语句应该是简单的。而且每打开一次只提交一条SQL语句,如果将这些SQL积累到一定条数(比如00条)再提交到数据库,那么其效率将有所提高,即类似于:

for i:=0 to 100 do begin
with insertQry do begin
close;
sql.Clear;
for j:=0 to 99 do
begin
sql.Add('insert into myTbl(mID) values('+Inttostr(i*100+j)+')');
end;
ExecSQL;
end;
end;

第二种方法在数据库中肯定有缓存,Append会将数据暂存到缓存中,待Post时会一次性将数据提交给服务器,至于提交的过程,我想应该不是以SQL语句的形式提交,效率应该更高一点儿,但是就如4楼所说,如果没有禁止刷新界面的话,其效率受界面影响,如果禁止刷新界面的话,其效率肯定比一次提交一条SQL语句的第一种方法要高得多。

10000条语句在实际插入的过程中,也就是几秒种的事,如果要测试的话,建议将再加大10倍数据量。

cuixd2020 2009-12-01
  • 打赏
  • 举报
回复
其实都差不多了,数据量不大你根本没必要考虑。
第二种更清晰,语言风格更好一些,毕竟是ado自己提供的方法。
sparklerl 2009-11-29
  • 打赏
  • 举报
回复
一万条 两种方式都会让人崩溃吧
第一种方式如果在循环中间加上 Application.ProcessMessages 至少不会有假死的情况出现

第二中方式 如果tempQry是设置的批量提交模式 再最后提交的时候会需要较长时间,如果不是这个模式和第一种有点类似,在新增一条记录时上一条记录会提交到数据库

可以试试以第二种方式设置成批量提交的模式(即
tempQry.CursorType:=ctStatic;

tempQry.LockType:= ltBatchOptimistic;
)

然后每一百条(或其他值)记录 post或 updatebatch一次

没有试过 不知道 会不会好点
yukileo 2009-11-28
  • 打赏
  • 举报
回复
倾向于第一种
sql语句是最快的
全部insert之后再显示数据
要比insert一条之后就更新好很多
starluck 2009-11-27
  • 打赏
  • 举报
回复
就是缓存的功能. locktype ltbatch 这个就行了.
jjwang2004 2009-11-27
  • 打赏
  • 举报
回复
感谢各位帮顶,感谢Avan_Lau优化意见、bdmh见解。
TO Avan_Lau,你说的优化语句,是这样吗,晚上回去测试,再跟大家报告测试结果
with tempQry do begin
close;
sql.Clear;
sql.Add('insert into myTbl(mID) values(:mID)');
prepared;
for i:=0 to 10000 do begin
close;
parameters.ParamByName('mID').Value:=i;
ExecSQL;
end;
end;

//方式二:
insertQry.ClearFields;
for i:=0 to 10000 do begin
tempQry.Append;
tempQry.FieldByName('mID').Value:=i;
end;
insertQry.Post;

//还有 dateset 的cache更新数据是什么东东?
de410 2009-11-27
  • 打赏
  • 举报
回复
倾向于第二种方法~
starluck 2009-11-27
  • 打赏
  • 举报
回复
可以试下. 我记得第一种会慢很多.
bdmh 2009-11-27
  • 打赏
  • 举报
回复
这是两种插入记录到数据库的方法,如果只谈插入效率的话,当然是insert快,因为insert与界面无关,直接通过sql把数据插入到数据库,并不立即显示在界面

append的结果会即时反映到界面,而且会触发相关事件,如果从所见即所得的角度去看,append要好一些
wintergoes 2009-11-27
  • 打赏
  • 举报
回复
感觉第2个要快
suuuu 2009-11-27
  • 打赏
  • 举报
回复
个人还是比较喜欢第二种方法,感觉简单好懂!
金卯刀 2009-11-27
  • 打赏
  • 举报
回复
方式一,可以改進,將sql語句的指定,放在外部,然后prepare;
方式二,若dataset沒有采用cache更新數據,在下一次append之前,就會執行post,將數據提交到數據庫;

兩種方式哪個快,你可以采用sql profile跟蹤看看。沒有實際跟蹤,不知道。個人猜測:方式一改進後,會比較快

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧