我有以下查询,其中Date
具有数据类型non-nullable date-time
,GroupingId
具有数据类型non-nullable int
,IsCompleted
具有数据类型non-nullable tinyint(1)
。
SELECT
*
FROM
Table
WHERE
Date < @TimeNow
AND
GroupingId = @GroupingId
AND
IsCompleted = 0;
我在这个GroupingId
表上有一个索引,Date
,IsCompleted
按这个顺序排列。
出于某种原因,如果我使用t.IsCompleted = 0
运行此查询,它的执行速度每次都比t.IsCompleted = 1
慢得多。
我认为它可能无法有效地索引,但可以对其进行一些帮助。
编辑
我已经更新了示例查询,使其更加清晰。 设置IsCompleted = 0
时,它返回的行要少得多,并且比设置IsCompleted = 1
时花费的时间长得多
查询不能使用索引进行排序。 因此,查询的性能将由与where
条件匹配的行数驱动。 据推测,IsCompleted = 0
的项目多于IsCompleted = 1
。
此查询的更好索引是(groupingId, isCompleted, date)
。 前两个键可以按任一顺序排列。
此条件:
((t.Date >= @StartDate AND t.Date < @EndDate) OR (t.Date < @TimeNow))
也有点奇怪。 我希望大部分或所有日期都在过去。 假设@TimeNow
表示类似于当前日期的内容,这将返回所有行。