這是我遇到的問題。我查詢的表格有1.7億行。我編寫了一個存儲過程來對錶中的最新條目進行簡單查詢。當我用這樣的硬編碼字符串寫WHERE
子句時:DATEADD在存儲過程的WHERE子句中的神祕行爲
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > '2012-07-17 10:10:35.477'
它非常快。不到一秒鐘。 StartTime
位於非聚集索引中。
不過,我真正想要的是這樣的:
DECLARE @fifteenMinutesAgo datetime;
SET @fifteenMinutesAgo = DATEADD(n , -15 , GETDATE());
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > @fifteenMinutesAgo
的問題是,當我運行第二個查詢,它需要近3分鐘!
所以我開始亂搞,瘋狂搜索。我認爲這可能是一個數據類型問題,所以我嘗試了各種CAST和CONVERT,但沒有成功。我嘗試使用OPTIMIZE FOR
,但意識到它不適用於此版本的SQL。我檢查了StartTime
的數據類型;它是類型datetime
。
,我試過了,這是非常奇怪的另一件事,是這樣的:
DECLARE @fifteenDaysAgo datetime;
SET @fifteenDaysAgo = DATEADD(d , -15 , GETDATE());
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > @fifteenDaysAgo
我改變了它從搜索的最後15分鐘,最後15天。神奇的是它又快又快了!不到一秒鐘。
這使我相信,SQL以某種方式難以比較時間?它不需要查看datetime
的TIME
部分以查看它是否符合比較聲明?我不知道。我在這裏抓着吸管。
所以我的問題是,我怎樣才能使這合理快速,仍然保持我的@fifteenMinutesAgo
動態?
您是否查看了兩次查詢之間的執行計劃,以查看執行中可能存在的差異? – LittleBobbyTables 2012-07-17 16:31:02
我應該包括那個。是的,執行計劃是相同的。 – davehale23 2012-07-17 16:33:35
您可以嘗試執行存儲過程'WITH RECOMPILE'選項的緩慢版本並查看是否有幫助? – a1ex07 2012-07-17 16:37:59