hor*_*rgh 6 sql-server delphi performance ado delphi-7
我需要提高数据加载的性能.当前的algorythm从表中完整选择:
select Field1, Field2,...,FieldN from Table1 order by FieldM
Run Code Online (Sandbox Code Playgroud)
从文本文件(例如,每个数据表行的文本文件行)读取新数据.该表有一个主键,包含两个字段.对于文本文件的每一行,它通过这两个字段(即主键)定位必要的行.
query.Locate('Field1;Field2',VarArrayOf([Value1,Value2]),[]);
Run Code Online (Sandbox Code Playgroud)
如果Locate返回True,则编辑该行,否则添加新行.
因此,只要该表包含大约200000行,每个Locate操作都需要一定的时间...因此它设法每秒更新大约5-6行.
我应该考虑采取哪些措施来改善它?
可能通过单独的查询替换通过这个伟大的选择定位?
val*_*lex 10
不要使用Locate().如果你使用locate(),那么Delphi在客户端搜索行只是从查询中扫描行集需要很多时间.
如果您有权访问MSSQL来创建存储过程,那么创建以下过程并在没有任何条件的情况下为TEXT文件中的每一行运行它(在Delphi中使用TAdoStoredProc.ExecProc).所以在这种情况下,您不需要先选择和定位过程.如果找到Filed1和Field2,它会更新记录,如果没有,则更新.
CREATE PROCEDURE dbo.update_table1
@Field1 int, --key1
@Field2 int, --key2
@Field3 int, -- data fileds
@Field4 int
AS
SET NOCOUNT ON
update table1 set Field3=@Field3,Field4=@Field4
where Field1=@Field1 and Field2=@Field2;
IF(@@Rowcount=0)
BEGIN
insert into table1(Field1,Field2,Field3,Field4)
values (@Field1,@Field2,@Field3,@Field4);
END
GO
Run Code Online (Sandbox Code Playgroud)
以下是使用ADO调用此存储过程的Delphi代码:
......
var
ADOStoredP: TADOStoredProc;
......
begin
........
ADOStoredP:=TADOStoredProc.Create(nil);
try
ADOStoredP.Connection:=DataMod.SQL_ADOConnection; //Your ADO Connection instance here
ADOStoredP.ProcedureName:='Update_table1';
ADOStoredP.Parameters.CreateParameter('@Field1', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field2', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field3', ftInteger, pdInput, 0, 0);
ADOStoredP.Parameters.CreateParameter('@Field4', ftInteger, pdInput, 0, 0);
While () -- Your text file loop here
begin
ADOStoredP.Parameters.ParamByName('@Field1').Value:=Field1 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field2').Value:=Field2 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field3').Value:=Field3 value from text file here;
ADOStoredP.Parameters.ParamByName('@Field4').Value:=Field4 value from text file here;
ADOStoredP.ExecProc;
end
finally
if Assigned(ADOStoredP) then
begin
ADOStoredP.Free;
end;
end;
........
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1478 次 |
| 最近记录: |