做的是一个交叉表,动态生成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;
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;
解决方案 »
- 关于Treeview中使用savetostream 的问题
- 如何获取其它程序TreeView控件的选中的项
- 如何动态创建进度条?
- 软件申请著作权,需要打印源代码,这个源代码该怎样打?没有要不要文档?没有文档怎么办?
- 请zhoutian618(周天)进来拿分,关于reportbuilder
- 大家来帮帮忙!在线等!!!
- 现在要求将程序由SQL SERVER转到Oracle下,出现了一系列的问题,求救!
- 如何写测试样例``````
- ??一台wIN98的机器,突然运行速度变得很慢,排除病毒可能,还有可能什么原因
- 请帮忙。 ^o^
- 关于多线程的问题,解决了给分
- delphi7如何才能使用ms sql作为数据库?
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;
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;
将cxGrid的过滤什么,一些其他的东西全部去掉,或者直接用DBgrid来显示!
原因是,cxGrid里面做了很多额外的处理!
把SQL贴出来吧。
你说的"额外的处理"是指哪些呢? 如何操作? 谢谢:)
因为我不但把SQL单独在PL/SQL上执行过,也试过在query中SQL不变的情况下运行queryTest.Excute,速度非常快.我不明白为什么cxGrid建列那么慢呢? 如何优化呢?
将cxGrid的过滤什么,一些其他的东西全部去掉
试试
2:创建完列后 再置DataSource属性试试
谢了先!