2017-02-10 33 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

相关问题