問:DateTime.Now如何影響SQL Server中的查詢計劃緩存?
是否經過DateTime.Now
作爲參數傳遞給一個進程防止SQL Server緩存的查詢計劃?如果是這樣,那麼Web應用錯過了巨大的性能收益?
可能的解決方案:
我想DateTime.Today.AddDays(1)
將是一個可能的解決方案。它會將相同的結束日期傳遞給sql proc(每天)。用戶仍然可以獲得最新的數據。請說出這一點。
給出的例子:
比方說,我們有一個存儲過程。它將數據報告給網頁上的用戶。用戶可以設置日期範圍。如果用戶設置今天的日期作爲「截止日期」,其中包括今天的數據,Web應用程序通過DateTime.Now
到SQL PROC。
假設一個用戶運行report-- 5/1/2010
到now
--over和過幾次。在網頁上,用戶看到5/1/2010
到5/4/2010
。但Web應用程序將DateTime.Now
傳遞給sql proc作爲結束日期。因此,proc中的結束日期將始終不同,儘管用戶正在查詢類似的日期範圍。
假設的表和用戶數量的記錄數量都很大。所以任何性能收益很重要。因此這個問題的重要性。
例proc和執行(如果這能幫助理解):
CREATE PROCEDURE GetFooData
@StartDate datetime
@EndDate datetime
AS
SELECT *
FROM Foo
WHERE LogDate >= @StartDate
AND LogDate < @EndDate
下面是使用DateTime.Now樣品執行:
EXEC GetFooData '2010-05-01', '2010-05-04 15:41:27' -- passed in DateTime.Now
下面是使用DateTime.Today的樣品執行。 AddDays(1)
EXEC GetFooData '2010-05-01', '2010-05-05' -- passed in DateTime.Today.AddDays(1)
相同的數據i因爲當前時間是:2010-05-04 15:41:27
,所以這兩個返回都是特效。
感謝您的回答,@Remus。我正在處理的真正的SQL查詢很複雜;它涉及多個連接表和where子句。那麼性能增益可能是不平凡的? – 2010-05-05 01:49:51
可能。運行SET STATISTICS TIME ON後,您可以在SSMS查詢窗口中運行查詢。這將打印查詢編譯時間,這將是您*可*保存的時間。還有各種性能計數器可以幫助您做出決定,請參閱http://blogs.msdn.com/sqlprogrammability/archive/2007/01/19/12-0-plan-cache-trace-events-and-performance -counters.aspx。請注意,SQL Server在自動參數化查詢方面做得相當不錯,但每次使用@parameters時都沒有發生完全相同的文本傳遞。 – 2010-05-05 03:45:34