我面临一个非常独特的问题。我有一个T-SQL查询,它给我每日股票报告。 当我在SQL Server Management Studio中执行此查询时,执行该操作需要零秒,但在执行该过程时,相同的查询块将占用未识别的时间。
答案 0 :(得分:2)
可能有很多原因,但我相信Parameter Sniffing
是原因。
有很多方法可以解决这个问题。但以下两种方式最为常见。
OPTION (OPTIMIZE FOR ...)
子句。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