要实现一个根据时间查询数据生成报表的功能,写了如下存储过程:

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一个变量,然后给这个变量赋上参数的值,在存储过程中使用此变量的值就可以了。