2014-08-27 12 views

回答

2

可能有很多原因,但我相信Parameter Sniffing是這裏的原因。 有很多方法可以解決這個問題。但以下兩種方式是最常見的。

  1. 您可以輸入參數的本地副本,並在查詢
  2. 使用它們或在查詢的末尾添加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 
+0

當您使用以下 – Avtansh 2014-10-22 11:21:49

+0

上述兩種方式都告訴SQL Server生成通用執行計劃,而不是使用自己的智能。上述任何方法是否適合您? – 2014-10-22 12:03:30

+0

不,我的問題是關於執行T-SQL查詢和具有相同查詢的過程之間的執行時間差異。 – Avtansh 2014-11-10 07:22:12