SQL数据查询的性能问题

zhougang86 2008-10-15 04:34:05
最近做项目需要用到数据查询,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语句会好点吗?这样扫描一次就可以了!


希望您能耐心读完








...全文
66 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2008-10-15
  • 打赏
  • 举报
回复
看下
ws_hgo 2008-10-15
  • 打赏
  • 举报
回复
看下
zhougang86 2008-10-15
  • 打赏
  • 举报
回复
怎么一个人都不回复啊,TMD,伤心死了我

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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