我有以下查询,其中Date
的数据类型为non-nullable date-time
,GroupingId
的数据类型为non-nullable int
,而IsCompleted
的数据类型为{{ 1}}。
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
相比,返回的行少得多,并且花费的时间长得多
答案 0 :(得分:1)
您的查询无法使用索引进行排序。因此,查询的性能将由与where
条件匹配的行数决定。推测,IsCompleted = 0
的项目多于IsCompleted = 1
。
此查询的最佳索引是(groupingId, isCompleted, date)
。前两个键可以是任意顺序。
这种情况:
((t.Date >= @StartDate AND t.Date < @EndDate) OR (t.Date < @TimeNow))
也有点奇怪。我希望大多数或所有日期都在过去。假设@TimeNow
代表当前日期,则将返回所有行。