我要一次性插入几万条数据到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;
谢谢大家了.  

来自: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;
  

来自: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条。
  

来自:fifa99, 时间:2003-6-4 12:38:00, ID:1923749
我写的肯定是插10000条的,只不过每十条数据插入1次,这样速度比较快。
你可以自己测试一下,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;  

来自:菜根, 时间: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状态)
看看块不快  

来自: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就可以大幅度提高效率.  

来自:fifa99, 时间:2003-6-5 12:39:00, ID:1927080
我也用csUseServer的。
看样子使用存储过程是最好的办法了。
谢谢各位了,散分。分数太少,请见谅