请问如何提高该存储过程的执行效率
上次我提问的是联接查询,查询是查询出来了,但是执行还是有3s左右的停顿才显示出数据,我现在用的是建立临时表的办法,数据也查出了,感觉上么,好像也快了点,想问下,在原来的基础上哈能优化吗????
USE [GQ-QiaoYing]
GO
/****** Object: StoredProcedure [dbo].[SelectLastData] Script Date: 07/08/2012 08:14:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SelectLastData]
as
create table #tempLastdata
(SiteID int,
SiteName varchar(50),
ShuiWei varchar(50),
LiuLiang varchar(50),
LiuLiang_Total varchar(50),
YuLiang varchar(50),
MYL varchar(50),
YYL varchar(50),
date_time datetime )
declare @SiteID varchar(50),
@SiteName varchar(50),
@ShuiWei varchar(50),
@LiuLiang varchar(50),
@LiuLiang_Total varchar(50),
@YuLiang varchar(50),
@MYL varchar(50),
@YYL varchar(50),
@date_time datetime,
@Month varchar(50),
@Year varchar(50),
@SelectIndex int,
@count int
select @count=COUNT(*) from LastData
set @SelectIndex=1
Select @Month=MAX(CONVERT(varchar(7),date_time,120)),@Year=MAX(CONVERT(varchar(4),date_time,120)) from HistoryData
while @SelectIndex<=@count
begin
select @MYL=SUM(Yuliang)from HistoryData where Date_Time >= @Month+'-01' and SiteID=@SelectIndex
select @YYL=SUM(Yuliang)from HistoryData where Date_Time >= @Year+'-01-01' and SiteID=@SelectIndex
select @ShuiWei=ShuiWei,@LiuLiang=LiuLiang,@LiuLiang_Total=LiuLiang_Total,@YuLiang=YuLiang,@date_time=Date_Time
from LastData where SiteID=@SelectIndex order by SiteID
select @SiteName=SiteName from SiteInfo where SiteID=@SelectIndex order by SiteID
insert into #tempLastdata values (@SelectIndex,@SiteName,@ShuiWei,@LiuLiang,@LiuLiang_Total,@YuLiang,@MYL,@YYL,@date_time)
set @SelectIndex=@SelectIndex+1
end
select * from #tempLastdata
------解决方案--------------------
Assembly code
--试下这个速度是多少
alter proc [dbo].[SelectLastData]
as
declare
@Month varchar(50),
@Year varchar(50)
Select @Month=MAX(CONVERT(varchar(7),date_time,120)),@Year=MAX(CONVERT(varchar(4),date_time,120)) from HistoryData;
if object_id('tempdb..#tempLastdata') is not null drop table #tempLastdata;
select SiteID,SiteName=convert(varchar(50),''),
ShuiWei,LiuLiang,LiuLiang_Total,YuLiang,
MYL=convert(varchar(50),''),
YYL=convert(varchar(50),''),
Date_Time
into #tempLastdata
from LastData where 1=2;
insert into #tempLastdata
select SiteID,ShuiWei,LiuLiang,LiuLiang_Total,YuLiang,Date_Time
from LastData;
if object_id('tempdb..#t1') is not null drop table #t1;
select SiteID,sum(case when convert(varchar(7),date_time,120)>@Month then Yuliang
else 0 end) myl,
sum(Yuliang) yyl
into #t1
from HistoryData
where convert(varchar(4),date_time,120) >= @Year
group by SiteID;
update #tempLastdata
set MYL=#t1.myl,
YYL=#t1.yyl
from #t1
where #t1.SiteID=#tempLastdata.SiteID;
update #tempLastdata
set SiteName=SiteInfo.SiteName
from SiteInfo
where #tempLastdata.SiteID=SiteInfo.SiteID;
select * from #tempLastdata order by SiteID;
drop table #tempLastdata,#t1;
go
------解决方案--------------------
SQL code
ALTER proc [dbo].[SelectLastData]
as
create table #tempLastdata
(
SiteID int,
SiteName varchar(50),
ShuiWei varchar(50),
LiuLiang varchar(50),
LiuLiang_Total varchar(50),
YuLiang varchar(50),
MYL varchar(50),
YYL varchar(50),
date_time datetime
)
declare @SiteID varchar(50),
@SiteName varchar(50),
@ShuiWei varchar(50),
@LiuLiang varchar(50),