代码之家  ›  专栏  ›  技术社区  ›  Jeferson Tenorio David Smithers

使用相同的参数,相同的SQL运行速度较慢或较快[重复]

  •  1
  • Jeferson Tenorio David Smithers  · 技术社区  · 11 年前

    我有一个运行速度极快(1秒)的查询,请参阅以下内容:

    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过程中具有相同的声明类型。

    • 我在exec过程中传递所有值“NULL”,只是为了得到与上面显示的查询相同的结果,从而快速运行。参数范围没有变化

    老实说,当我通过过程运行查询时,我注意到“执行计划”发生了变化,但不知道如何解决这个问题,因为查询的参数是相同的。

    不幸的是,由于这里没有提到的其他原因,我需要被放入PROC查询中,以免使问题进一步复杂化。

    关于重复消息:它的问题没有重复,因为它在任何系统中运行都很慢(Query Analyzer、C#asp.net等)。

    1 回复  |  直到 11 年前
        1
  •  4
  •   Aaron Bertrand    11 年前

    存储过程的参数 现在 是一样的,但当计划第一次被缓存时,它们是什么?您可以通过添加 OPTION RECOMPILE .

    如果是2008+(请指定版本!),由于语句本身应该使用相同的计划,因此还应该检查会话和存储过程的SET设置。例如,具有 ARITHABORT 坚持一个而不坚持另一个可能会导致不同的计划,如果你有不同的计划的话,一个可能是坏的,一个可以是好的。还要注意,即使查询文本中的一个空格差异也会使SQL Server将它们视为两个不同的计划。

    通过强制设置和查询文本相同,可以避免这些计划差异,但仍然无法通过这种方式控制参数嗅探问题。如果这是一个参数嗅探问题,您也可以尝试 OPTIMIZE FOR ...