我要一次性插入几万条数据到sybase表中,以下是我的程序,大家看能否再优化一下,现在插入10000条数据要12秒左右。
adoquery1.close;
for j := 1 to 1000 do
begin
adoquery1.sql.clear;
begin
for i := 1 to 10 do
begin
adoquery1.sql.add('insert into aaa values(' + '''' + inttostr(i) + '''' + ')');
end;
adoquery1.ExecSQL;
end;
end;
adoquery1.Close;
谢谢大家了.
adoquery1.close;
for j := 1 to 1000 do
begin
adoquery1.sql.clear;
begin
for i := 1 to 10 do
begin
adoquery1.sql.add('insert into aaa values(' + '''' + inttostr(i) + '''' + ')');
end;
adoquery1.ExecSQL;
end;
end;
adoquery1.Close;
谢谢大家了.
来自:hongxinyan, 时间:2003-6-3 17:01:00, ID:1921656
adoquery1.open;
for j := 1 to 1000 do
begin
for i := 1 to 10 do
begin
adoquery1.append;
adoquery1.fields[0].asstring:=inttostr(i);
end;
adoquery1.post;
end;
end;
for j := 1 to 1000 do
begin
for i := 1 to 10 do
begin
adoquery1.append;
adoquery1.fields[0].asstring:=inttostr(i);
end;
adoquery1.post;
end;
end;
来自:fifa99, 时间:2003-6-4 10:19:00, ID:1923234
我试过你的写法,那样更慢。
来自:Shd, 时间:2003-6-4 11:13:00, ID:1923489
var
SqlStr: String;
begin
SqlStr := '';
for j := 1 to 1000 do
begin
for i := 1 to 10 do
begin
SqlStr := SqlStr + 'insert into aaa values('+QuotedStr(inttostr(i))+')';
end;
end;
adoquery1.close;
adoquery1.sql.Text := SqlStr
adoquery1.ExecSQL;
adoquery1.Close;
end;
这才是一次插如10000条,
你那个是1000次,每次插入10条。
SqlStr: String;
begin
SqlStr := '';
for j := 1 to 1000 do
begin
for i := 1 to 10 do
begin
SqlStr := SqlStr + 'insert into aaa values('+QuotedStr(inttostr(i))+')';
end;
end;
adoquery1.close;
adoquery1.sql.Text := SqlStr
adoquery1.ExecSQL;
adoquery1.Close;
end;
这才是一次插如10000条,
你那个是1000次,每次插入10条。
来自:fifa99, 时间:2003-6-4 12:38:00, ID:1923749
我写的肯定是插10000条的,只不过每十条数据插入1次,这样速度比较快。
你可以自己测试一下,10000条数据的插入操作,用一次execsql,速度非常慢的。
你可以自己测试一下,10000条数据的插入操作,用一次execsql,速度非常慢的。
来自:Tassadar, 时间:2003-6-5 11:30:00, ID:1926838
我没在sybase上面试验过,我在msSQL上面用存储过程插入10000条大概在一秒钟左右
代码如下,给你参考一下。
存储过程
CREATE PROCEDURE pro_test
@sqlstr text
AS
exec(@sqlstr)
GO
Delphi代码
var
i : Integer;
TickCount : Cardinal;
sqlstr : String;
begin
with ADOCommand1 do
begin
CommandText := 'truncate table tbTest';
Execute;
sqlstr := '';
conSQL.BeginTrans;
TickCount := GetTickCount;
for i := 1 to 10000 do
begin
sqlstr := sqlstr + 'insert into tbTest values(' + IntToStr(i)
+ ', ''' + IntToStr(i) + ''')'#13#10;
if i mod 100 = 0 then
begin
ADOStoredProc1.Parameters.ParamByName('@sqlstr').Value := sqlstr;
ADOStoredProc1.ExecProc;
sqlstr := '';
end;
end;
if sqlstr <> '' then
begin
ADOStoredProc1.Parameters.ParamByName('@sqlstr').Value := sqlstr;
ADOStoredProc1.ExecProc;
end;
conSQL.CommitTrans;
end;
TickCount := GetTickCount - TickCount;
Caption := FloatToStr(TickCount/1000);
end;
代码如下,给你参考一下。
存储过程
CREATE PROCEDURE pro_test
@sqlstr text
AS
exec(@sqlstr)
GO
Delphi代码
var
i : Integer;
TickCount : Cardinal;
sqlstr : String;
begin
with ADOCommand1 do
begin
CommandText := 'truncate table tbTest';
Execute;
sqlstr := '';
conSQL.BeginTrans;
TickCount := GetTickCount;
for i := 1 to 10000 do
begin
sqlstr := sqlstr + 'insert into tbTest values(' + IntToStr(i)
+ ', ''' + IntToStr(i) + ''')'#13#10;
if i mod 100 = 0 then
begin
ADOStoredProc1.Parameters.ParamByName('@sqlstr').Value := sqlstr;
ADOStoredProc1.ExecProc;
sqlstr := '';
end;
end;
if sqlstr <> '' then
begin
ADOStoredProc1.Parameters.ParamByName('@sqlstr').Value := sqlstr;
ADOStoredProc1.ExecProc;
end;
conSQL.CommitTrans;
end;
TickCount := GetTickCount - TickCount;
Caption := FloatToStr(TickCount/1000);
end;
来自:菜根, 时间:2003-6-5 11:38:00, ID:1926878
fifa99, 你的方法不错,这样速度很快,我设定执行100次QUERY,速度是23m,你的方法是18m,而Shd方法是43m,你的速度很快
来自:fifa99, 时间:2003-6-5 12:01:00, ID:1926973
谢谢Tassadar先,你的方法我试一下,如果速度更快,我就给你分数。
来自:Pipi., 时间:2003-6-5 12:13:00, ID:1927002
你可以使用参数
然后prepared:=true
然后才进入循环,
循环体内,只需要设置参数的值并execsql之(不要改变sql和prepared状态)
看看块不快
然后prepared:=true
然后才进入循环,
循环体内,只需要设置参数的值并execsql之(不要改变sql和prepared状态)
看看块不快
来自:fifa99, 时间:2003-6-5 12:24:00, ID:1927031
谢谢pipi,我试一下先。
来自:Tassadar, 时间:2003-6-5 12:34:00, ID:1927061
pipi:的方法我也试过了(在msSQL上面)对效率几乎没什么影响
影响大一点的就是一次提交的数量,我试验大概是在50左右最好,
还有adoConnection的CursorLocation,用csUseClient第一次很慢,
后来快一点,用csUseServer速度平均,还有用Transaction可以提高一点速度,但是
提高得很少,用store procedure就可以大幅度提高效率.
影响大一点的就是一次提交的数量,我试验大概是在50左右最好,
还有adoConnection的CursorLocation,用csUseClient第一次很慢,
后来快一点,用csUseServer速度平均,还有用Transaction可以提高一点速度,但是
提高得很少,用store procedure就可以大幅度提高效率.
来自:fifa99, 时间:2003-6-5 12:39:00, ID:1927080
我也用csUseServer的。
看样子使用存储过程是最好的办法了。
谢谢各位了,散分。分数太少,请见谅
看样子使用存储过程是最好的办法了。
谢谢各位了,散分。分数太少,请见谅