1

我有一个运行非常快(1秒)查询见下文:相同的SQL运行具有相同的参数或快或慢

SELECT * 
FROM (select ROW_NUMBER() OVER (ORDER BY [Rank] DESC) AS RowNum, * 
      FROM [product].[FnSearchKeyword]('basic', null, null, null, null, null, null,   null) 
    ) AS RowConstrainedResult 
WHERE RowNum  = 1 AND RowNum < 30 

糟糕,如果我把这个查询过程中需要15秒运行如下:

CREATE anydata 
    @keywords nvarchar(4000), 
    @minimunRate int, 
    @priceFrom decimal, 
    @priceTo decimal, 
    @relaeseStart datetime, 
    @releaseEnd datetime, 
    @categoryList nvarchar(4000), 
    @storeList nvarchar(4000), 
    @rowBegin int, 
    @rowEnd int, 
    @orderBy int, 
    @isAdult bit = null 
AS 
SELECT * 
FROM (select ROW_NUMBER() OVER (ORDER BY [Rank] DESC) AS RowNum, * 
      FROM [product].[FnSearchKeyword]('basic', @minimunRate , @priceFrom , @priceTo  , null, null, null, null) 
    ) AS RowConstrainedResult 
WHERE RowNum  = 1 AND RowNum < 30 

当我玩的是SQL,返回延时15秒:

exec anydata null, null, null, null, null, null, null, null, null, null, null 

注:

  • 功能FnSearchKeyword的参数在AnyDATA的过程同样声明的类型。

  • 我传递的所有值“NULL”在EXEC程序,只需要有如上图所示的查询结果也一样跑得快。在参数的范围

老实说没有变化,我注意到,当我运行通过程序查询中的“执行计划”改变了,但不知道如何解决这个问题,因为的参数查询是一样的。

不幸的是我需要放在一个PROC查询里面,这里没有提到的其他原因不会使问题进一步复杂化。

关于重复的信息:它的问题isn't重复的,因为在任何系统中它的低速行驶(查询分析器,C#asp.net,其他)。

+1

请参阅http://stackoverflow.com/questions/12483064/query-runs-fast-in-query-analyzer-but-slow-in- c-sharp-application和http://stackoverflow.com/questions/10175422/sql-runs-fast-in-ssms-slow-in-asp-net。可能与参数值无关,而是会话和/或过程的SET设置。 – 2013-02-21 18:15:40

回答

4

您的存储过程现在的的参数是相同的,但是当计划第一次被缓存时它们是什么?您可以通过添加OPTION RECOMPILE来阻止参数嗅探。

如果2008+(请注明版本!),自言本身应该使用相同的计划,你也应该检查会话和存储过程中设置的设置。例如,如果一个人拥有ARITHABORT而不是另一个可能会导致不同的计划,并且如果您有不同的计划,则可能会很糟糕,而且可能会很好。还要注意,即使查询文本中存在单个空间差异,SQL Server也可以将它们视为两种不同的计划。

通过强制设置和查询文本是一样的,你能避免这些计划的差异,但你仍然无法控制参数嗅探这个样子。如果它是一个参数嗅探问题,您也可以尝试使用OPTIMIZE FOR ...

+1

+1:我前几天也遇到过这个问题。就我而言,这是从3分钟减少到1秒。我的内联表功能不允许任何形式的“RECOMPILE”选项。为了解决这个问题,我把它改成了一个多表值函数,并且在查询结束时添加了OPTION(RECOMPILE)来解决我的问题。 – 2013-02-21 19:00:43

+0

谢谢。我把** OPTION(RECOMPILE)**放在我的PROC的最后一行,其工作非常快。 – 2013-02-21 19:25:44