做的是一个交叉表,动态生成SQL执行,发现执行一次时间相当长(20-60秒中以上),其实SQL语句执行的时间其实并不长(在PL/SQL中1-2秒中就可以得到结果),通过任务管理器发现很长一段时间,cpu利用率是100%,而内存用量没有增加.出现问题的代码是这一段:
procedure TUnits_Load_Point_forecast_Form.FormShow(Sender: TObject);    
var
  sAutomaticSQL: string;
  iTimePoint: integer;
begin
  iTimePoint := qryTimePointFind.fieldByName('Description').AsInteger;
  self.iUnitsLoadTimePoint := iTimePoint;
  sAutomaticSQL := self.GetSQL(iTimePoint, self.ReportDate); //通过GetSQL函数生成SQL
  qryTimePoint.Close;
  qryTimePoint.SQL.Clear;
  qryTimePoint.SQL.Add(sAutomaticSQL);
  qryTimePoint.ExecSQL;
  CreateBands(GridDBBandedTableView1, iTimePoint);
  CreateFieldColumn(GridDBBandedTableView1, qryTimePoint, iTimePoint);//这个就是导致性能差的代码.具体事先见下
end;

解决方案 »

  1.   

    这短代码执行效率真是慢得要命:
    procedure TUnits_Load_Point_forecast_Form.CreateFieldColumn(
      pGrid: TcxGridDBBandedTableView; pQuery: TOraQuery; const TimePoint: integer);
    var
      i, j: integer;
    begin
      with pGrid do
      begin
        CreateColumn;
        Columns[0].Position.BandIndex := 0;
        Columns[0].DataBinding.FieldName := '单位名称';
        Columns[0].Options.Editing := false;
        Columns[0].Options.Moving := false;
        Columns[0].Options.Filtering := false;
      end;  for i := 1 to pQuery.FieldCount - 1 do
      begin
        Application.ProcessMessages;
        j := (2 * i) - 1;
        pGrid.CreateColumn;
        pGrid.Columns[j].DataBinding.FieldName := '预计负荷' + IntToStr(i);
        pGrid.Columns[j].Position.BandIndex := i;
        pGrid.CreateColumn;
        pGrid.Columns[j + 1].DataBinding.FieldName := '调度修改' + IntToStr(i);
        pGrid.Columns[j + 1].Position.BandIndex := i;    //下面的代码对效率没有太多影响,主要是上面......真是晕~~
        with pGrid.Columns[j].Options do
        begin
          Editing := false;
          Moving := false;
          Sorting := false;
          Filtering := false;
        end;    with pGrid.Columns[j + 1].Options do
        begin
          Editing := false;
          Moving := false;
          Sorting := false;
          Filtering := false;
        end;  
      end;
    end;
      

  2.   

    我的SQL是这样生成的:
    function TUnits_Load_Point_forecast_Form.GetSQL(
      const TimePoint: integer; const ReportDate: string): string;
    var
      sSelectSQL, sFromSQL, sWhereSQL, sGroupSQL: string;
      i: integer;
    begin
      sSelectSQL := '';
      for i := 1 to TimePoint do
      begin
        sSelectSQL := sSelectSQL + ', Sum(decode(EHour,' + IntToStr(i) + ', EValue)) 预计负荷' + IntToStr(i) + ', Sum(decode(EHour,' + IntToStr(i) + ', DDLoad)) 调度修改' + IntToStr(i);
      end;
      sSelectSQL := 'Select Unit 单位名称' + sSelectSQL;
      sFromSQL := ' from MD_ULETimePoint';
      sWhereSQL := ' where ReportDate=''' + ReportDate + '''';
      sGroupSQL := ' group by unit';  Result := sSelectSQL + sFromSQL + sWhereSQL + sGroupSQL;end;
      

  3.   

    是不是用cxGrid来显示的?
    将cxGrid的过滤什么,一些其他的东西全部去掉,或者直接用DBgrid来显示!
    原因是,cxGrid里面做了很多额外的处理!
      

  4.   

    PL/SQL不是返回全部结果集吧,否则怎么能快。
    把SQL贴出来吧。
      

  5.   

    to lwk_hlj,确实是用的dev组件,因为界面要求方面的原因,所以只能用cxGrid来显示.
    你说的"额外的处理"是指哪些呢? 如何操作? 谢谢:)
      

  6.   

    to  lijinghe1, 我的表中只有48条记录,通过交叉表体现在grid上是两条记录. 在PL/SQL中可以一次全部显示的.:)
      

  7.   

    问题是出在cxGrid创建列上.
    因为我不但把SQL单独在PL/SQL上执行过,也试过在query中SQL不变的情况下运行queryTest.Excute,速度非常快.我不明白为什么cxGrid建列那么慢呢? 如何优化呢?
      

  8.   

    可能就是 lwk_hlj(阿凯(向双星努力)) 说的
    将cxGrid的过滤什么,一些其他的东西全部去掉
    试试
      

  9.   

    to qizhanfeng(glacier) 这些功能再何处设定呢?
      

  10.   

    1: 在创建列时将pGrid.DataSource置空
    2:创建完列后 再置DataSource属性试试
      

  11.   

    DreamStrat的方法可以提高15%左右的效率.
    谢了先!