查询的速度太慢了,呜呜呜……(求SQL程序)(100分)

H

hawlj

Unregistered / Unconfirmed
GUEST, unregistred user!
在下写一个学籍管理程序采用delphi5自带的ADO数据库连接ACCESS文件
学籍数据库结构如下:
xh学号:
zh座号:(如:C020101)表示初中2002年入学的一班1号学生
xm姓名:
bd学籍变动:(1,2,3,4,5……分别表示辍学,留级……)
……
统计表数据结构如下:
rd:年段
bj:班级
zrs:总人数
……
BjList:array[1..6] of TStringList;分别表示初一年至高三年的班级名称及班级代号。

现要做一个学校学生情况统计表作如下程序程序,虽然运行正确但运行需将近一分钟。
求各位大虾帮帮忙:
procedure TDM1.Getqxsxtjb;
var
i,j:integer;
sqls,tmpS:string;
tmpADOQuery:TADOQuery;
oldcur:tcursor;
begin
oldcur:=Screen.Cursor;
screen.cursor :=crHourGlass;
tmpADOQuery:=TADOQuery.Create(Self);
tmpADOQuery.Connection:=ADOConnection1;

with tmpADOQuery do begin
SQL.Add('Delete from qxxstjb');
ExecSQL;
Close;
end;

try
With DStj do begin
close;
CommandText:='select * from qxxstjb';
open;
end;

for i:=1 to 6 do begin
for j:=0 to BjList.Count-1 do begin
tmpS:=bjList.Values[bjList.Names[j]];
sqls:='select count(*) from xsda where ';
sqls:= sqls + ' ' + prockeyword('zh',tmpS, 'and');
tmpADOQuery.SQL.Clear;
tmpADOQuery.SQL.Add(sqls);
tmpADOQuery.Open;
with DStj do begin
Append;
fieldbyname('rd').AsString:=RD;
fieldbyname('bj').AsString:=bjList.Names[j];
fieldbyname('zrs').Asinteger:=tmpADOQuery.Fields[0].Value;//总人数
Post;
end;
tmpADOQuery.Close;
……
end;
end;

finally
tmpADOQuery.Free;
screen.cursor :=oldcur;
end;
end;
 
一:大概没有人知道你在prockeyword里面做了什么动作,如果影响很大的建议改写
最怕循环里再做很长很长的循环
二:把for循环里的语法拿到for外面去执行(只要执行一次),在循环里面用Filter
过滤。
 
试一下, 没做测试, 大概是这样子 :)
begin
oldcur:=Screen.Cursor;
screen.cursor :=crHourGlass;
tmpADOQuery:=TADOQuery.Create(Self);
ADOConnection1.Keepconnection := True;
tmpADOQuery.Connection:=ADOConnection1;

with tmpADOQuery do begin
SQL.Add('Delete from qxxstjb');
ExecSQL;
Close;
end;

try
for i:=1 to 6 do begin
for j:=0 to BjList.Count-1 do begin
tmpS:=bjList.Values[bjList.Names[j]];
sqls:='insert into qxxstjb (rd, bj, zrs) select :rd, :bj, count(*) from xsda where ';
sqls:= sqls + ' ' + prockeyword('zh',tmpS, 'and');
tmpADOQuery.SQL.Clear;
tmpADOQuery.SQL.Add(sqls);
tmpADOQuery.Parameters.ParamByName('rd').Value := Rd;
tmpADOQuery.Parameters.ParamByName('bj').Value := bjList.Names[j];
tmpADOQuery.prepared := True;
tmpADOQuery.ExecSql;
tmpADOQuery.Close;
……
end;
end;
with tmpADOQuery do begin
SQL.clear;
SQL.Add('select * from qxxstjb');
open;
EnableControls;
/* 这里 可加上DataSource 及 DBgrid 和 DBNavigator 先是数据
*/
Close;
end;


finally
......
另外: 对xsda表的zh字段加索引,
 
prockeyword('zh',tmpS, 'and')函数功能是对字段zh的值包含字符串tmpS

to zyxxyz 速度没有提高
 
这样行不行:
1 对xsda表的zh字段加索引;
2 sqls:='insert into qxxstjb (rd, bj, zrs) select :rd, :bj, count(*) from xsda where ';
改成 sqls:='insert into qxxstjb (rd, bj, zrs) select :rd, :bj, count(zh) from xsda where ';
 
to zyxxyz
这样好象没什么影响?
而且我所要查询的数据包括总人数(zrs),还包括男生人数、女生人数、寄读人数等还要怎么办?

 
换数据库吧,改成sqlserver或oracle,用存储过程来做。
速度肯定会快起来
 
可是我这只是一个小程序不想安装SQL SERVER等
 
顶部