Sql-Server
參數觸發不同的執行計劃,為什麼?
我有一張桌子
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)