Sql server 2008 T-SQL过程花费的时间太长,但相同的查询块在零秒内执行
我面临着一个非常独特的问题。我有一个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 ( @
当我在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,您是否尝试过我为您的存储过程建议的任何上述方法?