Sql-Server

參數觸發不同的執行計劃,為什麼?

  • February 12, 2013

我有一張桌子

CREATE TABLE [dbo].[Numbers]
   (
       [Date] [date] NULL,
       [Time] [time](3) NULL,
       [Value] [char](10) NULL
   )

並且該表具有 > 100 億行,因此它按月分區並且在[Date], [Time] ASC

現在我使用一個表值函式來讀取這些數據:

SELECT * 
FROM [dbo].[QueryNumbers] ('2012-10-08','2012-10-08','07:00:00.000','08:00:00.000')

這會在 1 秒內返回大約 6000 行

但是,當我這樣做時:

declare

@StartDate date,
@EndDate date,
@StartTime time(3),
@EndTime time(3),

SET @StartDate = '2012-10-08';
SET @EndDate ='2012-10-08';
SET @StartTime ='07:00:00.000';
SET @EndTime = '08:00:00.000';

SELECT * 
FROM [dbo].[QueryNumbers] (@StartDate,@EndDate,@StartTime,@EndTime)

相同的查詢需要 3 分鐘(這是一個災難),我玩了一下參數,似乎時間參數觸發了不同的行為。有人告訴我這裡出了什麼問題嗎?

您的第一個查詢具有參數常量,因此當 sql 編譯計劃時,它確切地知道參數將是什麼,並且可以使用該知識來選擇最佳計劃。

在第二個查詢中,值是參數化的,因此 sql 將創建一個計劃,該計劃將適用於參數的任何潛在值。

您可以通過使用 OPTION (RECOMPILE) 子句執行參數化查詢來測試這一點。這將允許 sql 為這些特定值創建最佳計劃。

declare

@StartDate date,
@EndDate date,
@StartTime time(3),
@EndTime time(3),

SET @StartDate = '2012-10-08';
SET @EndDate ='2012-10-08';
SET @StartTime ='07:00:00.000';
SET @EndTime = '08:00:00.000';

SELECT * 
FROM [dbo].[QueryNumbers] (@StartDate,@EndDate,@StartTime,@EndTime) OPTION (RECOMPILE)

引用自:https://dba.stackexchange.com/questions/34606