[高手请入]多个QUERY查询时速度明显减慢,尤其是在98和数据量大的情况下,如何能提高速度并简化查询语句?

0000007 2004-08-27 11:31:05
表如下:

名单 质量 数量
小麦 优质 20
大米 一般 20
小麦 优质 50
大米 一般 20
小麦 差 55


DataModule1.AQueryzhanji.Close;
Datamodule1.AQueryzhanji.SQL.Clear;
DataModule1.AQueryzhanji.SQL.Add('select * from 表 order by 日期 DESC'); //查询所有;
DataModule1.AQueryzhanji.Open;

DataModule1.AdoQueryGoal.Close;
Datamodule1.AdoQueryGoal.SQL.Clear;
DataModule1.AdoQueryGoal.SQL.Add('select count(*) from 表 where 结果=''优质''');
DataModule1.AdoQueryGoal.Open;
win:=DataModule1.ADOQueryGoal.Fields[0].value;

DataModule1.AdoQueryGoal.Close;
Datamodule1.AdoQueryGoal.SQL.Clear;
DataModule1.AdoQueryGoal.SQL.Add('select count(*) from 表 where 结果=''一般''');
DataModule1.AdoQueryGoal.Open;


DataModule1.AdoQuery.Close;
Datamodule1.AdoQuery.SQL.Clear;
DataModule1.AdoQuery.SQL.Add('select count(*) from 表 where 结果='差''');
DataModule1.AdoQuery.Open;



分别要计算出优质、差、一般的记录数,用三个QUERY查询,在数据量大时会很慢,甚至出现死机……如何简便?能否有简单的方法?
...全文
173 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
0000007 2004-08-29
  • 打赏
  • 举报
回复
to yifei1900(逸飞) 及各位高手!

这么写为什么不能通过呢?
DataModule1.AdoQuery1.Close;
Datamodule1.AdoQuery1.SQL.Clear;
DataModule1.AdoQuery1.SQL.Add('select q4.cnt as allcnt,q1.cnt as q1cnt,q2.cnt as q2cnt,q3.cnt as q3cnt
from
(select count(*) as cnt from qxkz where qxid=0)as q1,
(select count(*) as cnt from qxkz where qxid=1)as q2,
(select count(*) as cnt from qxkz where qxid=2)as q3,
(select count(*) as cnt from qxkz)as q4
');

DataModule1.AdoQuery1.Open;
hmily1688 2004-08-28
  • 打赏
  • 举报
回复
To pdbird(老巢) :你写的是哪个库的sql语句啊,麻烦给解释一下decode的用法
hmily1688 2004-08-28
  • 打赏
  • 举报
回复
To angle097113(深思<刘强>) :加永久字段也不会快到哪儿去,我觉得关键是在第一条
select * from 表 order by 日期 DESC这呢,如果库中有个几十万或几百万条数据,你把它全部显示出来肯定要慢得要死,就算你加上索引也不会快到哪儿去,问楼主你的这个表中有多少条数据。
yifei1900 2004-08-28
  • 打赏
  • 举报
回复
用一个SQL语句返回所有的结果:
select q4.cnt as allcnt,q1.cnt as q1cnt,q2.cnt as q2cnt,q3.cnt as q3cnt
from
(select count(*) as cnt from qxkz where qxid=0)as q1,
(select count(*) as cnt from qxkz where qxid=1)as q2,
(select count(*) as cnt from qxkz where qxid=2)as q3,
(select count(*) as cnt from qxkz)as q4
然后字段allcnt,q1cnt,q2cnt,q3cnt分别代表总数据行数、好、中、差三种数据行数,
自己相应的改一下就行,
不用多个查询。
angle097113 2004-08-27
  • 打赏
  • 举报
回复
把你的语句加到数据集的里面然后添加永久字段可能会快一些的吧
你的数据量多大啊 怎么回你说得那么慢呢
shitianj 2004-08-27
  • 打赏
  • 举报
回复
补充:一般情况下字段名和表名都不要用汉字(汉字会加大查询时的系统开销);再有如果是查询结果一般要建立有效的索引,而在进行增、删、改时千万不要忘了把索引给去掉!因为你每进行一次增加或其他操作,系统都会重排一次索引。切记~!
kaguo 2004-08-27
  • 打赏
  • 举报
回复
这个就没什么程序方法了,办法就是给数据库'结果'字段加上索引
pdbird 2004-08-27
  • 打赏
  • 举报
回复

select decode(结果,优质,count(数量),0) into l_good,decode(结果,一般,count(数量),0) into l_gen,decode(结果,差,count(数量),0) into l_bad from 表
Tensionli 2004-08-27
  • 打赏
  • 举报
回复
用存储过程写好,再执行

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧