在线程中
我用BDE和ADO都测试了 为什么有下面的问题
用Table 可以立即更新数据
而用Query 的SQL 却要等几秒才更新成功! 我可能是哪做错了?是用TABLE好还是QUERY好!总感觉SQL方便一些!

解决方案 »

  1.   

    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
    query1.close;
    query1.sql.clear;
    query1.sql.Add(sqlstr);
    query1.execsql;这是插入语句我尝试不在线程中 做一个循环!
    for i:=0 to 10000 do begin
    name:='test'+inttostr(i);
    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
    query1.close;
    query1.sql.clear;
    query1.sql.Add(sqlstr);
    query1.execsql;
    end;
    结果依旧!10000条记录不是很多吧?
    我哪里做错了!帮帮我!郁闷死了。。
      

  2.   

    for i:=0 to 10000 do begin
    name:='test'+inttostr(i);
    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
    //query1.close;
    query1.sql.clear;
    query1.sql.Add(sqlstr);
    query1.execsql;
    end;
    试试把query1.close;去掉
      

  3.   

    //query1.close; 
    这样也可以?
      

  4.   


    query1.Open;
    for i:=0 to 10000 do begin
      name:='test'+inttostr(i);
      query1.Append;
      query1.FieldByName('字段1').AsString := name;
      query1.FieldByName('字段2').AsString := inttostr(i);
    end;
    试试看?
      

  5.   

    var i: integer;
      name, sqlstr: string;
    begin
      with Table1 do begin
        active := false;
        tablename := 'book';
        active := true;
      end;
      for i := 0 to 30000 do begin
        name := 'test' + inttostr(i);
        with Table1 do begin
          Append;
          FieldByName('id').asstring := name;
          FieldByName('ddf').asfloat := i;
          post;
        end;
      end;
    end;30000条记录转眼就进去了!
    估计上面的query1.close;
    query1.sql.clear;
    query1.sql.Add(sqlstr);
    query1.execsql;这段不停的关闭打开占用了时间! 是不是这样?
      

  6.   

    回复人: smiler007(笑一笑) ( ) 信誉:100  2004-12-08 00:02:00  得分: 0  
     
     
       同意去掉那句query1.close;语句
      
     
    你实验过吗?好象不可以
      

  7.   

    johnnyqiu() 能具体一些吗?
      

  8.   

    这个Close 是没有意义的,
    如果你看一下TQuery的源代码,就能明白,只要你修改了TQuery.SQL这个属性,TQuery就会自动关闭。
      TQuery = class(TDBDataSet)
      private
        ...
        property SQL: TStrings read FSQL write SetQuery;
      ...procedure TQuery.Disconnect;
    begin
      Close;
      UnPrepare;
    end;...procedure TQuery.SetQuery(Value: TStrings);
    begin
      if SQL.Text <> Value.Text then
      begin
        Disconnect;  //*******!!!!!!!!!!!
        SQL.BeginUpdate;
        try
          SQL.Assign(Value);
        finally
          SQL.EndUpdate;
        end;
      end;
    end;
    帖子折腾来折腾去,自己试验一下早就知道了。
      

  9.   

    加这一句可以加快速度:
    query1.Prepared:=true;
      

  10.   

    to pazee(耙子)老兄:
    我都实验过! 30000条记录要3分钟才进去
    <->
    for i:=0 to 30000 do begin
    name:='test'+inttostr(i);
    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
    query1.sql.clear;
    query1.sql.Add(sqlstr);
    query1.execsql;
    end;<-->
    query1.sql.clear;
    for i:=0 to 30000 do begin
    name:='test'+inttostr(i);
    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +')';
    query1.sql.Add(sqlstr);
    query1.execsql;
    end;
    <--->
    query1.sql.clear;
    for i:=0 to 30000 do begin
    name:='test'+inttostr(i);
    sqlstr := 'insert into book values(''' + name + ''',' + inttostr(i) +');';
    query1.sql.Add(sqlstr);
    end;
    query1.execsql;
      

  11.   

    首先问几个问题,
    1.你用的什么数据库,paradox还是access;
    2.索引怎么建的;
      

  12.   

    access 
    id 字段索引不过 paradox和access我都实验过!怎么也快不了!用Table 在paradox中很快 30000条记录转眼就进去了!
    但query怎么弄也不行
    数据库: test.mdb
    表:book
    字段: id  字符
           ddf  数字拜托老大给写一个测试一下!
      

  13.   

    var
      i, t: integer;
      sqlstr: string;
    begin
      Database1.Connected:= true;
      query1.sql.clear;
      t:= GetTickCount;
      for i:=0 to 10000 do begin
        name:= 'test' + inttostr(i);
        sqlstr:= 'insert into book values(''' + name + ''',' + inttostr(i) +')';
        query1.sql.Text:= sqlstr;
        query1.execsql;
      end;
      ShowMessage(IntToStr(GetTickCount-t));
    end;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    10000记录 paradox 用了 49.431s  Pentium M 1.6G /512M
      

  14.   

    10000记录 paradox 用了 66.620s  Pentium M 1.4G /258M郁闷!看来就是慢 !谁也弄不快!今天不玩了 !谢谢各位老大!
      

  15.   

    var
      i, t: integer;
      sqlstr: string;
    begin
      Database1.Connected:= true;
      query1.sql.clear;
      t:= GetTickCount;
      Query1.Sql.Add('insert into book values(:name, :i)');
      Query1.Prepare;   // 注意这句
      for i:=1 to 10000 do begin
        Name:= 'test' + inttostr(i);
        Query1.ParamByName('name').Value:= Name;
        Query1.ParamByName('i').AsFloat:= i;
        query1.execsql;
      end;
      Query1.UnPrepare;
      Database1.Close;
      ShowMessage(IntToStr(GetTickCount-t));
    end;用了 7.13s 不用 注释那句 17.768s
      

  16.   

    用Table 测试结果,对于本地文件数据库,理论上Table应该比Query快,但测试Paradox却SQL稍快过Tablevar
      i, t: integer;
      sqlstr: string;
    begin
      Database1.Connected:= true;
      Table1.Active:= true;
      t:= GetTickCount;
      for i:=1 to 10000 do begin
        Name:= 'test' + inttostr(i);
        Table1.AppendRecord([Name, i]);
      end;
      Database1.Close;
      ShowMessage(IntToStr(GetTickCount-t));
    end; 7.41s上面的测试每次我都把表Empty 并 pack了。
      

  17.   

    当TQuery的SQL属性发生改变的时候,TQuery要先关闭,然后再进行Unprepare的操作,最后才对SQL进行赋值。这样一来,耗费了不少的时间,也造成prepare的无效用(实际上,每次exesql的时候,会自动prepare,在这种情况下,也造成了prepare和unprepare对的反复进行,只增加负担,而没有提高效率)。
    楼主在每一次的循环里面,都Clear掉SQL,然后重新赋予一个类似的SQL。这必然是非常耗费时间的操作。
    实际上,象尿不湿这样做最好了,用Param来指定。
      

  18.   

    测试如下: P1.4/258M/Paradox/Empty后空表
    《一》速度:0.984S
    var i,t: integer;
      names, sqlstr: string;
    begin
    t:= GetTickCount;
      with Table1 do begin
        active := false;
        tablename := 'book';
        active := true;
      end;
      for i := 0 to 30000 do begin
        names := 'test' + inttostr(i);
        with Table1 do begin
          Append;
          FieldByName('id').asstring := names;
          FieldByName('ddf').asfloat := i;
          post;
        end;
      end;
      ShowMessage(IntToStr(GetTickCount-t));
    end;《二》时间1.531s
    var
      i, t: integer;
      Names,sqlstr: string;
    begin
      query1.sql.clear;
      t:= GetTickCount;
      Query1.Sql.Add('insert into book values(:name, :i)');
      Query1.Prepare;   
      for i:=1 to 10000 do begin
        Names:= 'test' + inttostr(i);
        Query1.ParamByName('name').Value:= Names;
        Query1.ParamByName('i').AsFloat:= i;
        query1.execsql;
      end;
      Query1.UnPrepare;
      ShowMessage(IntToStr(GetTickCount-t));
    end;《三》时间:36.203S
    去掉:Query1.Prepare; 不用Table的话估计耙子老大的方法是最好的!衷心感谢!感谢pazee(耙子)及各位!为了让和我一样郁闷过的朋友看到这次讨论。晚上回来接贴! 
    如果你有更好的方法也希望共享一下!
      

  19.   

    to  jacky_20001(金武)数据多不不知道!
    但空表添加10000条记录 的确如上!
    你可以测试一下!
      

  20.   

    欢迎参加下一贴的讨论!
    http://community.csdn.net/Expert/topic/3635/3635535.xml?temp=.6966516
      

  21.   

    回复人: jacky_20001(金武) ( ) 信誉:100  2004-12-11 09:49:00  得分: 0  
     
     
       table不可能比query快~~~
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    对于本地表比如paradox table肯定比query快,
    因为它本身不是sql数据库,是local sql,Table的操作更接近原操作,而sql还要通过解释才行。对于sql数据库,sql是远远快过table的