我正面臨一個非常特殊的問題。我有一個T-SQL查詢給我每日股票報告。 當我在SQL Server Management Studio中執行此查詢時,執行該操作需要零秒,但同一查詢塊在執行過程時需要未確定的時間。T-SQL過程需要太多時間,但在零秒內執行相同的查詢塊
0
A
回答
2
可能有很多原因,但我相信Parameter Sniffing
是這裏的原因。 有很多方法可以解決這個問題。但以下兩種方式是最常見的。
- 您可以輸入參數的本地副本,並在查詢
- 使用它們或在查詢的末尾添加
OPTION (OPTIMIZE FOR ...)
條款。
例如
使用OPTION優化用於:
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)提示? – Donal 2014-08-27 10:40:18