各位:
    有没有碰到过Access查询效率很低的问题?
    我的Access数据库中一个Company表,存有8000条左右的数据,在Delphi中将其Select出来,由于DataGrid不可能一次显示这么多数据,故每一次我只是选出8条,可以翻页,SQL语句中我采用 Select top n 做的,一切都好,可惜的是翻到100页时,就很慢很慢的,而翻到1000页时,这页显示居然不可思议的用了15分钟。
    不知各位有没有好的办法?指点指点!

解决方案 »

  1.   

    Access 数据库本来就很慢,还是换数据库吧。
      

  2.   

    Access 数据库慢.其实dbgrid自己会缓冲的.
      

  3.   

    你这样做就会很慢的,数据量小于100000时Access还可以,象你这样要15分钟我想是查询设计的不是多合理,我做过一个分页的,以为速度还可以,可能是记录太少吧,贴一些代码给你:
    uses ADOInt;
    ...
      aqStore: TADOQuery;  {主数据集,一次取全部出来,用adsClone来显示分页数据}
      dsStore: TDataSource;  {连到DBGrid的数据源}
    ...
    implementationvar
      pCount: Integer;
      curPage: Integer = 1;
      adsClone: TADODataSet;
    ...procedure TfrmEhlib.FormShow(Sender: TObject);
    begin
      ...
      adsClone := TADODataSet.Create(self);
      aqStore.Recordset.PageSize := 15;
      pCount := aqStore.Recordset.PageCount;
      ShowData(1);
    end;
    ...
    procedure TfrmEhlib.ShowData(iPage: Integer);  {显示iPage页数据,主要过程}
      procedure CreadeAdsField;
      var
        i: Integer;
      begin
        adsClone.Close;
        adsClone.FieldDefs.Clear;
        for i := 0 to aqStore.FieldCount - 1 do
        begin
          if i = 2 then Continue;
          adsClone.FieldDefs.Add(aqStore.Fields[i].FieldName, aqStore.Fields[i].DataType, aqStore.Fields[i].Size);
        end;
        adsClone.CreateDataSet;
      end;
    var
      i, j: Integer;
      rs: ADOInt.RecordSet;
    begin
      aqStore.Recordset.AbsolutePage := iPage;
      rs := aqStore.Recordset;
      CreadeAdsField;
      adsClone.DisableControls;  for i := 0 to rs.PageSize - 1 do
      begin
        adsClone.append;
        for j :=0 to rs.Fields.Count - 1 do
          adsClone.Fields[j].Value := rs.Fields[j].Value;
        rs.MoveNext;
        if rs.EOF then Break;
      end;
      adsClone.EnableControls; 
      adsClone.First;
      dsStore.DataSet := adsClone;
      lblCount.Caption := '页次:' + IntToStr(iPage) + '/' + IntToStr(pCount);
    end;
    ...
    procedure TfrmEhlib.lblfPageClick(Sender: TObject);
    begin
      curPage := 1;
      ShowData(curPage);
    end;procedure TfrmEhlib.lblpPageClick(Sender: TObject);
    begin
      if curPage = 1 then
      begin
        MessageBox(self.Handle, '已到了首页!', '提示', mb_IconInformation + mb_Ok);
        Exit;
      end;
      Dec(curPage);
      ShowData(curPage);
    end;procedure TfrmEhlib.lblnPageClick(Sender: TObject);
    begin
      if curPage = pCount then
      begin
        MessageBox(self.Handle, '已到了末页!', '提示', mb_IconInformation + mb_Ok);
        Exit;
      end;
      Inc(curPage);
      ShowData(curPage);
    end;procedure TfrmEhlib.lbllPageClick(Sender: TObject);
    begin
      curPage := pCount;
      ShowData(curPage);
    end;
      

  4.   

    weizi2000(秋风啊) 的想法挺好的
      

  5.   

    to weizi2000(秋风啊) :
    那个ADOInt是什么的东东啊?