Sql server 2008 T-SQL过程花费的时间太长,但相同的查询块在零秒内执行

Sql server 2008 T-SQL过程花费的时间太长,但相同的查询块在零秒内执行,sql-server-2008,tsql,ssms,Sql Server 2008,Tsql,Ssms,我面临着一个非常独特的问题。我有一个T-SQL查询,它给了我每日的库存报告。 当我在SQL Server Management Studio中执行此查询时,执行该查询需要零秒,但在执行整个过程时,相同的查询块需要未标识的时间。可能有很多原因,但我相信参数嗅探是原因所在。 有很多方法可以解决这个问题。但以下两种方式是最常见的 您可以制作输入参数的本地副本,并在查询中使用它们 或者在查询结束时附加选项(优化…子句) e、 g 使用选项优化: CREATE PROCEDURE Test ( @

我面临着一个非常独特的问题。我有一个T-SQL查询,它给了我每日的库存报告。
当我在SQL Server Management Studio中执行此查询时,执行该查询需要零秒,但在执行整个过程时,相同的查询块需要未标识的时间。

可能有很多原因,但我相信
参数嗅探是原因所在。
有很多方法可以解决这个问题。但以下两种方式是最常见的

  • 您可以制作输入参数的本地副本,并在查询中使用它们
  • 或者在查询结束时附加
    选项(优化…
    子句)
  • e、 g

    使用选项优化:

    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
    

    您是否尝试过使用WITH(NOLOCK)提示?当您使用以下两种方法时,请告诉SQL Server生成通用执行计划,而不是使用其自身的智能。上述任何方法对您有效吗?不,我的问题是关于执行T-SQL查询和具有相同查询的过程之间的执行时间差。T-SQL查询的执行时间为1秒,而在过程中编写的相同T-SQL查询的执行时间为8分钟。@Avtansh,您是否尝试过我为您的存储过程建议的任何上述方法?