我有以下查询: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时少得多,花费的时间也要长得多。
发布于 2018-06-29 14:36:33
查询不能使用索引进行排序。因此,查询的性能将由与where条件匹配的行数驱动。想必有更多的项目有IsCompleted = 0而不是IsCompleted = 1。
这个查询更好的索引是(groupingId, isCompleted, date)。前两个键可以按任意顺序排列。
这一条件:
((t.Date >= @StartDate AND t.Date < @EndDate) OR (t.Date < @TimeNow)) 也有点奇怪。我希望大多数或所有的约会都是过去的。假设@TimeNow代表的是当前日期,这将返回所有行。
https://stackoverflow.com/questions/51103904
复制相似问题