求切实提高查询速度的方法(,并且减少查询所占用的cpu资源sql server2000),请高手们帮帮忙(200分)

  • 主题发起人 主题发起人 c_jt
  • 开始时间 开始时间
C

c_jt

Unregistered / Unconfirmed
GUEST, unregistred user!
总共涉及5个表:期初库,销售库(头,单体),收款库(头,单体),求客户的应收未收情况.
现在使用的办法是通过临时表,使用insert 表a (字段a,字段b...) select 字段a....from
的方法,分别将各个表和视图中符合条件的记录插入到临时表a中,例子语句如下:
代码:
qry5.Close;
qry5.sql.Clear;
qry5.SQL.Add('insert findreceivezxk');
qry5.sql.Add('(no, finddate,finddate1, spellid, summD,summi,summ3 ) select  '+inttostr(no0));
qry5.SQl.Add(','''+datetostr(wwDBDateTimePicker3.date)+''','''+datetostr(wwDBDateTimePicker6.date)+''',');
qry5.sql.add('a.spellid,summD=sum(a.summD),summI=sum(a.summi),summ3=sum(a.summ3) ');
qry5.sql.add('from  OutputitemSumm a where a.status in (''3'',''D'',''I'')');
qry5.sql.add('and a.status1=''Z'' and a.orddate>='''+datetostr(wwDBDateTimePicker3.date)+'''');
qry5.sql.add('and a.orddate<='''+datetostr(wwDBDateTimePicker6.date)+'''');
qry5.sql.add('group by a.spellid order by a.spellid');
qry5.ExecSQL;  //所有的summD,summI,summ3 //该日销售有关金额
,最后对临时表中的记录进行操作,语句如下:
代码:
qry5.close;
qry5.sql.Clear;
qry5.sql.Add('insert findreceivezxk');
qry5.sql.Add('(no, sumall,finddate,finddate1, spellid,summda,summia,summ3a,qtyda,qty3a,receivea,sumsumma,summd1a,summi1a,summ31a,summZTa,qimoa)');
qry5.sql.Add('SELECT '+inttostr(no0)+',''A'','''+datetostr(wwDBDateTimePicker3.date)+''','''+datetostr(wwDBDateTimePicker6.date)+''',');
qry5.sql.Add('SPELLID, SUM(summD) summDa, SUM(summI) summIa, SUM(summ3) summ3a,');
qry5.sql.Add('SUM(qtyD) qtyDa, SUM(qty3) qty3a, SUM(receive+receivezt) receivea, SUM(sumsumm) sumsumma,');
qry5.sql.Add('SUM(summD1) summD1a, SUM(summI1) summI1a, SUM(summ31) summ31a,SUM(summZT+receivezt1) summZTa,SUM(qimo) qimoa');
qry5.sql.Add('FROM findreceiveZXK where no='''+inttostr(no0)+'''');
qry5.sql.Add('GROUP BY SPELLID order by spellid');
qry5.ExecSQL;
现在程序使用的时候占用cpu资源非常严重,从win2000 server中的性能管理器中发现当进行
这些操作的时候,cpu的使用常常上升到100,这时候系统的其他机器就非常慢,甚至响应时间过长,引起程序没响应
现在请教各位高手,看看有什么好办法可以明显提高查询的速度.并且减少查询所占用的cpu资源
使用的服务器是ibm的5600内存是256Mcpu是PIII800xeon
 
数据量有多大? 各个出现在Where语句中的字段都索引过没有?
第一步,先建立索引,如果还是非常慢的话再具体分析原因。
 
就这么几个表,有必要这么写吗,写个稍微复杂点SQL就解决了,实在不行多写几个视图,
把问题分步简化了,视图是属于数据库本身的,所以查询不会太慢的,如果你的数据量
不是非常大,应该没那么慢的
 
to左右手,你说可以写一个复杂一点的sql语句,你可以给我一个具体一点的例子吗?
 
对status1、a.status索引, a.status不要用IN,分三次查询,也应比你这快
 
老大,你写个视图或写个存储过程,比你这个样子写这么多SQL语句效率会提高很快的。
至于说写视图和存储过程,你再不会,去看帮助先。
 
首先,看一下你的程序一般情况下执行后临时表内产生的记录有多少。
如果会产生很多记录(如几千条或上万条),说明机器的处理时间主要用在复制数据上,
可以用视图来取代临时表;如果查询结果不多,则说明你的原始表索引创建不合理,
研究以下alicewen的建议。

可以这样建视图:
create or replace view findreceivezxk as
(select f1 as no, f2 as sumall, ... fn as qimoa
from OutputitemSumm where 条件 group by 分组)
union
(select f1 as no, f2 as sumall, ... fn as qimoa
from findreceiveZXK where 条件 group by 分组)
 
to:cxzhu
象你说的那样,用视图代替临时表,怎么控制多人查询时通过no的不同来判断..
你可以把你e_mail给我吗?我把程序给你看看,请帮帮手了,程序现在查询太慢,
我要给人杀死了,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
 
先建一个临时表,再insert
 
答:用视图代替临时表,怎么控制多人查询时通过no的不同来判断..
在多用户情况下,确实存在这个问题。但是可以通过给view起不同的名字来解决,
例如用no作为view名称的后缀,这样不同的no查询的结果就不会互相影响了。
为了节约系统资源,可以查询完之后马上把view删除。

我的email是cxzhu163@163.com,只是我自己也比较忙,不一定有时间仔细研究你的程序。
 
连表结构都没有,也不知道你要查哪些字段,怎么给你写呀
我建议你还是用视图吧,这样可以把问题简化,而且能提高速度
不知道你能有多少数据,已至于能那么慢?
 
去下个 分析sql语句的工具自己分析一下,在delphi.mychangshu.com下。
 
你在查询的时候先通过qry5来create 临时view
这样一来你用完之后就drop 临时view就可以了,就不用delete临时表了
或者你仔细看看你自己创建的index把查询条件调换一下,也许速度会快一点
 
后退
顶部