性能问题:请高手为我排忧解难,在线恭候大驾光临
CREATE procedure QueryACCP @StartTime datetime,@EndTime datetime
as
declare @STCD char(8)
declare @ACCP float
create table #Result(STCD CHAR(8) ,ACCP float)
declare STCDCursor cursor
for
select distinct STCD from ViewHourQuery where TM between @StartTime and @EndTime
open STCDCursor
while(0=0)
begin
fetch next from STCDCursor into @STCD
if(@@FETCH_STATUS<>0) BREAK
set @ACCP=dbo.TotalACCP(@STCD,@StartTime,@EndTime)
insert into #Result values(@STCD,@ACCP)
end
close STCDCursor
deallocate STCDCursor
select a.STCD,a.STNM,b.ADDVNM,c.ACCP from (ST_STBPRP_B a left outer join ST_ADDVCD_B B on a.ADDVCD=b.ADDVCD)inner join #Result c on a.STCD=c.STCD
drop table #Result
这是我写的存储过程,查询一段时间以内的各个站点的降雨量,STCD是站点号,ACCP是降雨量,最后连接2张表,投影STNM(站点名称),ADDVNM(站点所属城市名称)
TotalACCP函数是计算一个STCD的降雨量,里面用到了其他的几个函数
因为表中的记录不是连续的,有的没有进行统计,如某一天的记录没有,则调用NotExistDay求
NotExist1stXun(上旬记录没有)、NotExist2stXun(中旬记录没有)、NotExist3stXun(下旬记录没有)、NotExistMonth(月记录没有),计算的过程是:如果时间段跨月,则先在月表里去记录,该月记录不存在,则调用NotExistMonth求之,再在剩余的时间段里,够得上旬的则在旬表里取(旬分上、中、下),不够的则调用相应的函数求,再按同样的思路在天表里,最后在到时段表(给时间分段,取值再合计)
1.create function NotExistDay(@STCD CHAR(8),@Time datetime)---统计日降雨量函数
returns float
as
begin
declare @number float
set @number=0
select @number=isnull(sum(DRP),0)from ViewHourQuery where STCD=@STCD and TM between dateadd(dd,datediff(dd,0,@Time),0)and dateadd(ms,-3,dateadd(dd,datediff(dd,0,@Time),0))
return @number
end
其他的几个函数就不贴上来了,时段表记录有36万条,日表记录有18万条....
我现在是能求出相应站点在一个时间段内的降雨量了,但是性能太差了,360个站点要耗4分钟17秒,聚集索引也建立了,看看我的存储过程,能不能不写游标,游标很耗时间,我在执行计划里看了下,占34%(80多秒了),希望您能帮帮我!