在我当前的存储过程中,我从当前数据表和存档数据表中获取数据,其中我“联合所有”来自两个来源的选择语句。
但是,该过程需要很长时间才能执行,所以我在考虑如何优化性能。就我而言,我决定对存档数据是否存在进行条件检查。
对于我的情况,如果数据超过当天的45天限制,则会对其进行存档。
为简单起见,以下是2个简化案例。如果用户选择当前月份(在我们的情况下为5月,05/02是当天),则日期范围仅在当前数据集中,因为我们尚未突破45天限制(在05/01和05/31之间) 。同样适用于4月(04/01至04/30之间的日期),因为它是30天仍然是45天限制+ 5天后的2天。
但是,用户在当天选择March,其中一些日期将超过45天的限制(日期在03/01和03/31之间),这就是我需要查看的情况进入存档数据并将所有数据与当前数据结合起来。
我的问题如下:检查日期范围是否超过n天限制的最佳方式是什么?
答案 0 :(得分:0)
如果事情那么简单,你可以使用DATEDIFF()
返回指定的startdate和enddate之间交叉的指定日期部分边界的计数(有符号整数)。
switch(i) {
case 0 : // do something
cout << "A" << endl;
break;
case 1 : // do something else
cout << "B" << endl;
break;
// no default set
}
最后,如果您想避免使用条件语句,我会说您可以在存档表上创建一个覆盖索引(我不确定它有多大),其中您的时间戳将是第一个键。让SQL Server有效地查找该索引,您的代码将更易于维护和阅读。
这样的事情:
IF DATEDIFF(DAY, @StartDate, GETDATE()) < 45
BEGIN
-- Pseudo query
SELECT *
FROM dbo.Table
WHERE CreatedAt > @StartDate;
END;
ELSE
-- Another pseudo query
SELECT *
FROM dbo.Table
WHERE CreatedAt > @StartDate
UNION ALL
SELECT *
FROM Archive.Table
WHERE CreatedAt > @StartDate;
END;
为了进一步提高性能。您可以向归档表添加约束,例如:
SELECT *
FROM (
SELECT *
FROM dbo.Table
UNION ALL
SELECT *
FROM Archive.Table
) AS T
WHERE T.CreatedAt > @StartDate;
如果ALTER TABLE Archive.Table
ADD CONSTRAINT CK_ArchiveTable_CreatedAt CHECK (DATEDIFF(DAY, CreatedAt, GETDATE()) < 45);
小于45天,这应该提示SQL Server不要查询此表。请注意,可以使用DATEADD()重写此内容。它可能更有效率。