SQL数据查询的性能问题
最近做项目需要用到数据查询,ASP.NET+SQL2000,里面做一些分析很烦,举一个例子说吧,有一个表A,表A有字段如下:
表A(STCD VARCHAR(8),TM DATETIME,DYP),主键是STCD,TM,里面有记录40W条
现在我要做这样的一个分析:
(1)给出STCD列表,例如:'50100100,50103000,501031000',最多一次给你500个STCD查询
(2)开始时间和结束时间 @dtbegin,@dtEnd
现在输出的字段是
STCD,SUMDYP,PSPDYP,AVGPERCENT,APPRAISE
SUMDYP是该STCD在该段时间内的DYP和,PSPDYP是把数据库里每一年在@dtBegin到@dtEnd时间段内的DYP和再求平均,如2007-5-1~2007-6-1 SUMDYP=60,2008-5-1~2008-6-1 SUMDYP=50,则PSPDYP=60+50/2年=55,PSPDYP该从哪一年开始取值是不确定的,只要数据库中有记录就算上,AVGPERCENT =SUMDYP/PSPDYP*100-100 ,APPRAISE则根据AVGPERCENT值进行判断
看看我做的思路:
先对一个STCD考虑:
set @sumdyp=isnull(sum(is(dyp,0)),0) from A where STCD=@stcd AND TM between @dtBegin and @dtEnd
set @pspdyp=@sumdyp
declare @dtMin datetime--数据库中该STCD有记录的最小时间
decalre @tm1 datetime
set @tm1=dateadd(yy,-1,@dtBegin)
declare @tm2 datetime
set @tm2=dateadd(yy,-1,@dtEnd)
declare @count int
set @count=1-----记录年份
while(@tm1>=@dtMin)
begin
select @pspdyp+@pspdyp+isnull(sum(dyp),0) from A where STCD=@stcd AND TM between @tm1 and @tm2
set @count=@count+1
set @tm1=dateadd(yy,-1,@tm1)
set @tm2=dateadd(yy,-1,@tm2)
end
set @pspdyp=@pspdyp/@count
----
评价略
---
select @stcd as stcd,@sumdyp as sumdyp,@pspdyp as pspdyp,.....
这样是不是太常规了,是最笨的方法了,效率不好,有没有好的算法,望指点一下
基本都是scan,A表索引是TM,STCD,把那个循环写成一个动态的SQL语句会好点吗?这样扫描一次就可以了!
希望您能耐心读完