论文部分内容阅读
【摘 要】在delphi中利用dbExpress组件处理大量数据时,处理数据的速度是实际应用中一个重要的问题,如何提高数据处理速度对提升用户的使用效率起着至关重要的作用。解决这个问题必须对dbExpress组件及数据库的运行方式有深入的了解,才能合理的解决大量数据处理的速度问题。
【关键词】dbExpress组件;存储过程;索引对数据处理的影响
使用delphi的dbExpress组件在一般的日常事务中少量数据写入数据库时,运行速度不会有明显的影响,大部分应用都能正常平稳的运行,当有大量数据要一次性写入数据库时,写入速度问题就显得非常重要了,速度太慢会直接影响程序的使用,影响工作效率。为了验证dbExpress组件数据写入速度,我们以一次写入20万条记录来进行测试,找出提高dbExpress组件数据写入速度的方法。
测试思路:建立一个仿真数据表,在程序中以计算的方式来产生每一个字段的值,然后计算整体的执行时间。
测试方法:首先直接使用TClientDataSet和dbExpress组件在interBase中添加数据。代码如下:
procedure TfrmPermain.btndbExpressClick(sender:Tobject);
var
iCount:integer;
begin
ILOOPS:=StrToInt(edtTestCount.Text);
dmDBExpress.cdsTest.DisableControls;
pgLoops.Position:=0;
pgLoops.Max:=ILOOPS;
try
LogStartTime;
for iCount:=1 to ILOOPS do
begin
dmDBExpress.cdsTest.insert;
dmDBExpress.cdsTest.FieldByName(‘ID’).Value:=GetID;
dmDBExpress.cdsTest.FieldByName(‘Name’).Value:=GetName;
dmDBExpress.cdsTest.FieldByName(‘PHONE’).Value:=GetPhone;
dmDBExpress.cdsTest.FieldByName(‘ADDRESS’).Value:=GETAddress;
dmDBExpress.cdsTest.FieldByName(‘SALARY’).Value:=GetSalary;
dmDBExpress.cdsTest.FieldByName(‘EDATE’).Value:=NOW;
dmDBExpress.cdsTest.Post;
pgloops.Postion:=pgloops.Postion+1;
Application.ProcessMessages;
end;
dmDBExpress.cdsTest.ApplyUpdates(0);
LogEndTime;
LogRunTime(mmStatus,’DBX 新增’ +IntToStr(ILOOPS)+’笔数据时间 :’)
finally
dmDBExpress.cdsTest.EnableControls;
end;
end;
运行程序,首先输入较小的测试记录数,我们输入10000个记录数,得出的时间为34秒左右,输入20万个记录,所花的时间大约为700秒,大概是11分钟左右。写入效率明显有点低。看来直接使用dbExpress组件效率不够高。
因为我们使用的是关系型数据库,而关系型数据库的存储过程特性可以让执行速度提高。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。依据存储过程的特性我们对代码进行修改,利用dbExpress中的TstoredProc组件来调用存储过程,这里代码从略。加入调用存储过程后,写入10000个记录的时间大约为7秒,输入20万个记录的时间约为250秒,大概是4分多钟,时间大为提高。此结果证明存储过程的执行效率确实还是很不错的,能大幅度的提高数据的写入速度。
在此基础上我们还能提高写入数据的速度吗?我们来分析一下,数据写入数据库时数据库系统会进行一些什么操作。从关系型数据库工作的模式我们可以得知,当数据写入数据库时,数据库系统会为数据建立索引等信息,如果在写入数据时定义了许多的索引,这也就意味着写入数据的时间也会增加。如果是随机数据写入,数据库中存储索引的节点也会不断的增加和分裂,这样更进一步增加了处理时间。通过这个分析我们在使用存储过程的基础上,尽量减少索引的处理,先删除数据表的索引,当数据写入结束时再重新为所有数据建立索引,以此方法来提高数据的写入速度(代码从略)。在程序开始写入数据之前,先调用pDeleteIndexies函数将数据表索引删除,等数据写入完毕之后调用pCreareIndesies函数重新为所有数据建立索引信息。修改后的程序运行结果,写入20万条记录所用的时间约为140秒,比只使用存储过程提高了接近一倍的时间。
通过以上三种写入数据方法的比较我们得出这样的结论,在关系型数据库中,使用delphi的dbExpress组件进行数据库记录的写入时,存储过程的使用能大幅度提高写入的速度,再结合删除索引的方法则能进一步提高写入数据的速度。这个结论为大量数据录入速度的提高提供了解决办法,具有提高效率的积极作用。
参考文献:
[1] 《Delphi数据库编程》北京交通大学出版社
[2] 《SQL Server 从入门到精通》清华大学出版社
【关键词】dbExpress组件;存储过程;索引对数据处理的影响
使用delphi的dbExpress组件在一般的日常事务中少量数据写入数据库时,运行速度不会有明显的影响,大部分应用都能正常平稳的运行,当有大量数据要一次性写入数据库时,写入速度问题就显得非常重要了,速度太慢会直接影响程序的使用,影响工作效率。为了验证dbExpress组件数据写入速度,我们以一次写入20万条记录来进行测试,找出提高dbExpress组件数据写入速度的方法。
测试思路:建立一个仿真数据表,在程序中以计算的方式来产生每一个字段的值,然后计算整体的执行时间。
测试方法:首先直接使用TClientDataSet和dbExpress组件在interBase中添加数据。代码如下:
procedure TfrmPermain.btndbExpressClick(sender:Tobject);
var
iCount:integer;
begin
ILOOPS:=StrToInt(edtTestCount.Text);
dmDBExpress.cdsTest.DisableControls;
pgLoops.Position:=0;
pgLoops.Max:=ILOOPS;
try
LogStartTime;
for iCount:=1 to ILOOPS do
begin
dmDBExpress.cdsTest.insert;
dmDBExpress.cdsTest.FieldByName(‘ID’).Value:=GetID;
dmDBExpress.cdsTest.FieldByName(‘Name’).Value:=GetName;
dmDBExpress.cdsTest.FieldByName(‘PHONE’).Value:=GetPhone;
dmDBExpress.cdsTest.FieldByName(‘ADDRESS’).Value:=GETAddress;
dmDBExpress.cdsTest.FieldByName(‘SALARY’).Value:=GetSalary;
dmDBExpress.cdsTest.FieldByName(‘EDATE’).Value:=NOW;
dmDBExpress.cdsTest.Post;
pgloops.Postion:=pgloops.Postion+1;
Application.ProcessMessages;
end;
dmDBExpress.cdsTest.ApplyUpdates(0);
LogEndTime;
LogRunTime(mmStatus,’DBX 新增’ +IntToStr(ILOOPS)+’笔数据时间 :’)
finally
dmDBExpress.cdsTest.EnableControls;
end;
end;
运行程序,首先输入较小的测试记录数,我们输入10000个记录数,得出的时间为34秒左右,输入20万个记录,所花的时间大约为700秒,大概是11分钟左右。写入效率明显有点低。看来直接使用dbExpress组件效率不够高。
因为我们使用的是关系型数据库,而关系型数据库的存储过程特性可以让执行速度提高。存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。依据存储过程的特性我们对代码进行修改,利用dbExpress中的TstoredProc组件来调用存储过程,这里代码从略。加入调用存储过程后,写入10000个记录的时间大约为7秒,输入20万个记录的时间约为250秒,大概是4分多钟,时间大为提高。此结果证明存储过程的执行效率确实还是很不错的,能大幅度的提高数据的写入速度。
在此基础上我们还能提高写入数据的速度吗?我们来分析一下,数据写入数据库时数据库系统会进行一些什么操作。从关系型数据库工作的模式我们可以得知,当数据写入数据库时,数据库系统会为数据建立索引等信息,如果在写入数据时定义了许多的索引,这也就意味着写入数据的时间也会增加。如果是随机数据写入,数据库中存储索引的节点也会不断的增加和分裂,这样更进一步增加了处理时间。通过这个分析我们在使用存储过程的基础上,尽量减少索引的处理,先删除数据表的索引,当数据写入结束时再重新为所有数据建立索引,以此方法来提高数据的写入速度(代码从略)。在程序开始写入数据之前,先调用pDeleteIndexies函数将数据表索引删除,等数据写入完毕之后调用pCreareIndesies函数重新为所有数据建立索引信息。修改后的程序运行结果,写入20万条记录所用的时间约为140秒,比只使用存储过程提高了接近一倍的时间。
通过以上三种写入数据方法的比较我们得出这样的结论,在关系型数据库中,使用delphi的dbExpress组件进行数据库记录的写入时,存储过程的使用能大幅度提高写入的速度,再结合删除索引的方法则能进一步提高写入数据的速度。这个结论为大量数据录入速度的提高提供了解决办法,具有提高效率的积极作用。
参考文献:
[1] 《Delphi数据库编程》北京交通大学出版社
[2] 《SQL Server 从入门到精通》清华大学出版社