我正在優化一些查詢並遇到了一個奇怪的問題,我不知道該如何解釋。使用SQL Server 2012與下面的代碼:TSQL:靜態變量與where子句中的計算
DECLARE @startdate DATETIME2 = DATEADD(day,-1,GETDATE()),
@enddate DATETIME2 = GETDATE()
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN DATEADD(day,-1,GETDATE()) AND GETDATE()
AND somestate = 'NV'
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN @startdate AND @enddate
AND somestate = 'NV'
望着實際執行計劃,第一選擇有一個索引查找和鍵查找,其中,第二有一個聚集索引掃描。由於SELECT
與功能性用途基本相同,因此我不確定爲什麼執行計劃中存在差異。我最後一位DBA告訴我說,在WHERE
條款中聲明帶有值的變量要比使用WHERE
條款中的計算要好,但這似乎與該聲明相反。我希望澄清是什麼原因造成這兩個陳述之間的巨大差距。我確實試圖尋找一些關於這方面的答案,但沒有太多的運氣,如果有人能指出我正確的方向,我會非常感激。
謝謝!
設置[壞習慣踢 - 把NOLOCK無處不在](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 它是*不推薦*到處使用 - 相當相反! –
我猜在第二種情況下,sql服務器不知道startdate和enddate是相關的,他期望任何值,所以他選擇掃描(相隔日期)。 –