T-SQL过程占用太多时间,但在零秒内执行相同的查询块

时间:2014-08-27 10:38:28

标签: sql-server-2008 tsql ssms

我面临一个非常独特的问题。我有一个T-SQL查询,它给我每日股票报告。 当我在SQL Server Management Studio中执行此查询时,执行该操作需要零秒,但在执行该过程时,相同的查询块将占用未识别的时间。

1 个答案:

答案 0 :(得分:2)

可能有很多原因,但我相信Parameter Sniffing是原因。 有很多方法可以解决这个问题。但以下两种方式最为常见。

  1. 您可以制作输入参数的本地副本,并在查询中使用它们
  2. 或在查询末尾添加OPTION (OPTIMIZE FOR ...)子句。
  3. e.g。

    使用OPTION OPTIMIZE FOR:

    CREATE PROCEDURE Test
    (
        @Param1 VARCHAR(255),
        @Param2 INT,
        @Param3 BIGINT
    )
    as
    BEGIN
        SELECT * 
        FROM Customers
        WHERE  CustomerName = @Param1
            or CustomerId = @Param2
            or CityId = @Param3
        OPTION (OPTIMIZE FOR (@Param1 UNKNOWN, @Param2 UNKNOWN, @Param3 UNKNOWN))
    END
    

    使用局部变量:

    CREATE PROCEDURE Test
    (
        @Param1 VARCHAR(255),
        @Param2 INT,
        @Param3 BIGINT
    )
    as
    BEGIN
        DECLARE @Param1Local VARCHAR(255) = @Param1,
                @Param2Local INT = @Param2,
                @Param3Local BIGINT = @Param3
    
        SELECT * 
        FROM Customers
        WHERE  CustomerName = @Param1Local
            or CustomerId = @Param2Local
            or CityId = @Param3Local
    END