有一条SQL:
Select * from Users a,Groups b where a.ID = b.ID
执行后有50万条记录调入
然后又加了一个新用户,又要重新再调一次,
这样速度会很慢,有没有办法更快一些?
条件:
     一次必须调出所有数据。

解决方案 »

  1.   

    50万条记录调入内存要3、4秒,对于高效的程序来说已是很大的瓶颈,
    只是在新加一个User的情况下才会重新执行
    Select * from Users a,Groups b where a.ID = b.ID 调出所有数据,主要是在这些数据里查找做计算,如果发现找不到的用户,则加一个,然后再做其它的工作。
      

  2.   

    为了保证程序运行的高效一次将调入所有的数据到内存,然后在内存中做运算,
    这段是不连数据库的,如果要增加一个用户,则刚才数据不包含这个用户的信息,就需要再执行
    Select * from Users a,Groups b where a.ID = b.ID 调出所有数据。
    每次加一个用户都要重新调入一次所有数据,显然是不合理的,有没有更好的办法???
      

  3.   

    ADOQuery1.LockType := ltBatchOptimistic;
      ADOQuery1.CacheSize := 90000000;
      ADOQuery1.SQL.Text := ' Select * from Users a,Groups b where a.ID = b.ID ';
      //全部取出数据
      ADOQuery1.Open;
      ADOQuery1.Connection := nil;
    //得到新找到所有数据时,执行下面的语句
      ADOQuery2.Close;
      ADOQuery2.SQL.Text:='Select * from Users a,Groups b where a.ID = b.ID and a.ID='+Edit1.Text;
      ADOQuery2.Open;
      if ADOQuery2.RecordCount=1 then
      begin
        ADOQuery1.Insert;
        //把 ADOQuery2中的值,插入到 ADOQuery1中
        ADOQuery1.Post;
      end;
      

  4.   

    To madyak(无天):
    ID 值是自动增长的,不允许插入
      

  5.   

    ADOQuery1.Fields[0].AutoGenerateValue:=arNone;
      ADOQuery1.Fields[0].ReadOnly:=False;这样处理,ADOQuery1只是用来在客户端显示数据,并不能数据进行存储
      

  6.   

    楼上不愧是ADO高手,谢谢,敬请接分。