假设我在DateTime列(名为[Timestamp])上有一个索引,然后我在下面的查询中使用该列,
SELECT [Id], [Timestamp]
FROM [dbo].[MyTable]
WHERE FORMAT([Timestamp], 'yyyy/MM/dd HH') = '2022/12/14 01'
ORDER BY [Id]
执行此查询时是否使用[Timestamp]
列上的索引?否则,提高查询性能的好策略是什么呢?
不能,因为您在列上调用函数,所以索引不能提前知道哪些值符合您的标准。您需要不惜一切代价避免操纵WHERE
子句中的列值。比较日期时间的最佳方法通常是窗口比较,例如
DECLARE @StartDate datetime2(0) = '2022/12/14 01:00:00'
, @EndDate datetime2(0) = '2022/12/14 02:00:00';
SELECT [Id], [Timestamp]
FROM [dbo].[MyTable]
WHERE [Timestamp] >= @StartDate AND [Timestamp] < @EndDate
ORDER BY [Id];
备注:可以通过检查执行计划来检查索引是否被使用。