我正在使用一个数据库,我必须提取随时间变化的记录快照。快照表只有开始和结束日期ID列,因此执行此操作的标准方法是在日期查找表上进行连接。
简化示例:
SELECT
*
FROM
records
INNER JOIN
snapshots
ON records.RecordID = snapshots.RecordID
INNER JOIN
dates
ON dates.id BETWEEN snapshots.StartDateID AND snapshots.EndDateID
AND dates.date = '01-01-2018'
我已经遇到过这种情况似乎非常缓慢的情况,但可能是因为有很多快照可以在很长的日期范围内查找。
我知道日期表的ID只是'1900-01-01'
的天数。知道这一点,我可以明确地计算出什么是关键。
例如:
SELECT
*
FROM
records
INNER JOIN
snapshots
ON records.RecordID = snapshots.RecordID
AND DATEDIFF(DAY, '1900-01-01', '2018-01-01') BETWEEN snapshots.StartDateID AND snapshots.EndDateID
我发现这确实有效,并且遇到了这种情况似乎表现得更快的情况。
作为一名SQL新手,我不清楚是否有一些陷阱,我没有看到这应该阻止我使用第二种方法。