2017-02-10 65 views
2

在我一直使用過去:最優化的方式來獲得所有記錄比上月

WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1 

它得到我的一切,發生在上月的紀錄。例如,如果我運行了這個查詢,它會得到我在1月份發生的所有記錄。

但是,我目前正在使用一個更大的表,如果我使用上述查詢,它需要將近30分鐘才能加載。但是,如果我使用類似

WHERE [SettlementDate] >= DateAdd(DAY, -31, GETDATE()) 

它通常會在10秒內運行。

我的問題是:
如何在不增加處理時間的情況下獲得與WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1相同的結果?

謝謝!

+0

嘗試與期望的月比較'DATEPART(M,[date_col的])'。 –

+0

這個'DateAdd(DAY,-31,GETDATE())'也可能評估爲錯誤的數據。就像'GETDATE()'是例如3月1日一樣。 –

回答

1

您的查詢很慢,因爲當您執行DATEDIFF(m, [DATE_COL], GETDATE())時,它不能使用[Date_Col]上的任何索引。

無論如何,您可以使用以下where子句,這將使用[SettlementDate]上的索引,並希望它應該比DATEDIFF()函數執行更好。

WHERE [SettlementDate] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) 
AND [SettlementDate] < DATEADD(DAY,1,DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1)) 
1

問題是你有一個函數調用,查詢優化器無法看到裏面的函數。這意味着,它不能決定是否使用索引。在這種情況下,它讀取整個表格可能需要很長時間。 我建議你使用變量,我相信你的查詢會得到更好的結果:

declare @From datetime -- choose the same type as your SettlementDate column 
set @From = DateAdd(DAY, -31, GETDATE()) -- compute the starting date 
select * from yourTable where SettlementDate >= @From 

在這種情況下,SQL Server將知道你想你的SettlementDate值與日期比較,並沒有什麼其他有計算。如果你有該列的索引,它會使用它。

大約可優化搜索查詢的其他信息:https://www.codeproject.com/Articles/827764/Sargable-query-in-SQL-server

相關問題