2014-01-15 56 views
2

我有以下形式的查詢:爲什麼日期類型會極大地影響查詢執行的性能?

DECLARE @date DATETIME = <some_date> 

SELECT .... 
FROM a 
WHERE <some_conditions> AND a.LastEvent < @date 

LastEvent列是DATE類型。

查詢工作得很快。但是,如果我將@date類型更改爲DATE查詢執行似乎不會完成。如果我註釋掉條件

AND a.LastEvent < @date 

查詢工作再次快速。

我很驚訝參數的輕微改變會影響性能,但我不知道爲什麼會發生這種情況。

+4

比較執行計劃。 –

+0

我讀了一些說日期只是截斷時間或零時間的日期時間。不妨使用datetime作爲列類型。我認爲編譯器用「日期」做了一些有趣的事情,而日期時間非常簡單。 – Rich

+0

你是否在每次執行之前清除緩衝區和緩存以確保它不再使用先前存儲的執行計劃?你在桌上有什麼索引?你能發佈索引中的索引類型和列順序嗎?您還需要發佈什麼是「」當數據類型與WHER條件的右側不匹配時,隱式數據類型轉換髮生在左側。在第二次運行中,您說您正在將@date數據類型設置爲DATE,並且它與a.LastEvent的數據類型相同。 –

回答

1

這可能與比較需要內部比較需要比較的事實有關,由於每種類型的存儲性質,評估這兩種類型是一個更昂貴的操作。

對您的問題的其他評論都會增加運行測試的寶貴觀點,以確保您實際測量的是您認爲正在測量的內容。

理想情況下,儘可能多地希望儘可能匹配您的類型,因爲類型之間的轉換操作不是最便宜的事情。

此外,索引也基於存儲的類型,所以這可能實際上是您的查詢瓶頸,而不是在類型轉換。

查詢執行計劃應該可以幫助您推斷這兩種意見。

相關問題