要实现一个根据时间查询数据生成报表的功能,写了如下存储过程:
CREATE Procedure [dbo].[Report_SearchEnginOnAccount]
@FromDate DATETIME,
@ToDate DATETIME
AS
SELECT '' as ADGroup
,'' as Content
,'' as KeyWord
,sum([ViewAdPV]) as ViewAdPV
,sum([Listing]) as Listing
,sum([NB]) as NB
,sum([NU]) as NU
,sum([BouncedRate]) as BouncedRate
,sum([BouncedUV]) as BouncedUV
,sum([UV]) as UV
,sum([PV]) as PV
,[Date]
,sum([ClickCount]) as ClickCount
,sum([ShowCount]) as ShowCount
,sum([ClickRate]) as ClickRate
,sum([TotalPrice]) as TotalPrice
FROM [SmallChannelDB].[dbo].[SearchEnginDataReport_View]
WHERE [Date]<= @ToDate AND [DATE]>=@FromDate
Group by [date]
GO
在使用过程中出现了超时的错误,经查发现是因为存储过程执行时间太长,20万左右的数据一分多钟都没有执行完……我以为是sql语句里面出现的问题,然后直接把@ToDate和@FromDate赋值执行,不到1s就出结果了,后来经公司sql server高手指导,把View换成直接的表连接,然后给两个表的Date列分别加上索引,问题解决,但不知道具体原因是什么。结果第二天又恢复原状了……
Parameter sniffing”的特性,有几个解决办法,一个就是declare一个变量,然后给这个变量赋上参数的值,在存储过程中使用此变量的值就可以了。