因为记录量很大,处理很慢,请问高手们好的解决方法! procedure TForm1.yss1Click(Sender: TObject); 
var 
  i,j,pd: integer; 
  xs: array[1..8,0..8] of Integer; 
  a: array[0..1] of integer; 
  b: array[0..1] of integer; 
begin 
  closeallbut(); 
  for i:=0 to 1 do 
      begin 
        a[i]:=0; 
        b[i]:=i; 
      end; 
  ADOQuery1.Close; 
  ADOQuery1.SQL.Clear; 
  ADOQuery1.SQL.Add( 'SELECT * From 信息 where 序号= '+no.Caption); 
  ADOQuery1.Open; 
  for i:=1 to 8 do 
      begin 
        xs[i,0]:=0; 
        xs[1,i]:=ADOQuery1.FieldByName( 'a '+IntToStr(i)).AsInteger; 
        xs[2,i]:=ADOQuery1.FieldByName( 'b '+IntToStr(i)).AsInteger; 
        xs[3,i]:=ADOQuery1.FieldByName( 'c '+IntToStr(i)).AsInteger; 
        xs[4,i]:=ADOQuery1.FieldByName( 'd '+IntToStr(i)).AsInteger; 
        xs[5,i]:=ADOQuery1.FieldByName( 'e '+IntToStr(i)).AsInteger; 
        xs[6,i]:=ADOQuery1.FieldByName( 'f '+IntToStr(i)).AsInteger; 
        xs[7,i]:=ADOQuery1.FieldByName( 'g '+IntToStr(i)).AsInteger; 
        xs[8,i]:=ADOQuery1.FieldByName( 'h '+IntToStr(i)).AsInteger; 
      end; 
  ADOQuery1.SQL.Clear; 
  ADOQuery1.SQL.Add( 'SELECT * From 公式1 '); 
  ADOQuery1.Open; 
  ADOQuery1.First; 
  Gauge1.MaxValue:=ADOQuery1.RecordCount; 
  While not ADOQuery1.Eof  do //记录数100W左右 
        begin 
          Gauge1.Progress:=ADOQuery1.RecNo; 
          StatusBar1.Panels[2].Text:= ' 计算中...... '; 
          application.ProcessMessages; 
          pd:=xs[1,ADOQuery1.FieldByName( 'i1 ').AsInteger]+xs[2,ADOQuery1.FieldByName( 'i2 ').AsInteger]+xs[3,ADOQuery1.FieldByName( 'i3 ').AsInteger]+xs[4,ADOQuery1.FieldByName( 'i4 ').AsInteger] +xs[5,ADOQuery1.FieldByName( 'i5 ').AsInteger]+xs[6,ADOQuery1.FieldByName( 'i6 ').AsInteger]+xs[7,ADOQuery1.FieldByName( 'i7 ').AsInteger]+xs[8,ADOQuery1.FieldByName( 'i8 ').AsInteger]; 
          pd:=pd mod 2; 
          a[pd]:=a[pd]+1; 
          ADOQuery1.Next; 
        end; 
  ADOQuery1.Close; 
  ADOQuery1.SQL.Clear; 
  StatusBar1.Panels[2].Text:= ' 计算已完成. '; 
  application.ProcessMessages; 
  for i:=0 to 0 do 
      begin 
        for j:=i+1 to 1 do 
            begin 
              if a[i] <a[j] then 
                 begin 
                   pd:=a[j]; 
                   a[j]:=a[i]; 
                   a[i]:=pd; 
                   pd:=b[j]; 
                   b[j]:=b[i]; 
                   b[i]:=pd; 
                 end; 
            end; 
      end; 
  lla1.Caption:= ' '; 
  j:=0; 
  For i:=0 to 1 do 
      begin 
        if b[i]=0 then 
           begin 
             lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次   '; 
           end 
        else 
           begin 
             lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次   '; 
           end; 
        if i=0 then 
           begin 
             lla1.Caption:=lla1.Caption+ ' /    '; 
           end; 
        j:=j+a[i]; 
      end; 
  lla1.Caption:=lla1.Caption+ '  共 '+IntToStr(j)+ '次 '; 
  for i:=0 to 0 do 
      begin 
        if a[i] < >0 then 
           begin 
             for j:=1 to 49 do 
                 begin 
                   ADOQuery1.Close; 
                   ADOQuery1.SQL.Clear; 
                   ADOQuery1.SQL.Add( 'SELECT * From 属性表 where 号码= '+IntToStr(j)); 
                   ADOQuery1.Open; 
                   if b[i]=ADOQuery1.FieldByName( 'CA ').AsInteger then 
                      begin 
                        TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=True; 
                      end 
                   else 
                      begin 
                        TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=false; 
                      end; 
                   ADOQuery1.Close; 
                   ADOQuery1.SQL.Clear; 
                 end; 
           end; 
      end; 
  application.ProcessMessages; 
  ADOQuery1.Close; 
  ADOQuery1.SQL.Clear; 
  ADOQuery1.SQL.Add( 'SELECT * From 结果 where 序号= '+no.Caption); 
  ADOQuery1.Open; 
  ADOQuery1.Edit; 
  For i:=1 to 49 do 
      begin 
        ADOQuery1.FieldByName( 'i '+IntToStr(i)).AsString:=BoolToStr(TCheckBox(FindComponent( 'CheckBox '+IntToStr(i))).Checked); 
      end; 
  ADOQuery1.Post; 
  ADOQuery1.Close; 
  ADOQuery1.SQL.Clear; 
  openallbut(); 
end; 

解决方案 »

  1.   

    用更快的CPU会不会更快,目前双核Intel E6550/2G RAM   用XEON 四核会不会更快, 
      

  2.   

     While not ADOQuery1.Eof  do //记录数100W左右  
    程序会在每次循环后检查是否到达记录末端,改用for循环
      

  3.   

      ADOQuery1.SQL.Clear;  
      ADOQuery1.SQL.Add(  'SELECT * From 公式1  ');  
      ADOQuery1.Open;  
      ADOQuery1.First;  
      Gauge1.MaxValue:=ADOQuery1.RecordCount;  这样处理感觉不好,几万的数据库可以这样打开,100W应该使用分页方式打开这个数据库,这样内存占用少,处理速度快。
      

  4.   

    不知道你使用的是什么数据库,如果使用的是MSSQL或SyBase大型数据库,可以考虑一下把有些过程交给存储过程来完成