我在Sql Server 2008 Express中有一个包含1800万条记录的表。 结构看起来像这样(简化):
Id,GroupId,Value,Created
Id是具有聚簇索引的主键 GroupId是非聚集索引
在这种情况下,每10行获得一个新的groupId,意味着记录1-10具有GroupId 1,记录11-20具有GroupId 2,依此类推。
测试1:此查询运行需要23秒,并返回99条记录:
DECLARE @Start INT
SET @Start = 1050
从FieldValues中选择*,其中GroupId在@Start和@Start + 10之间
测试2:此查询需要0秒才能运行并返回99条记录:
DECLARE @Start INT
SET @Start = 1050
从FieldValues中选择*,其中GroupId = @Start union
从FieldValues中选择*,其中GroupId = @Start + 1 union
从FieldValues中选择*,其中GroupId = @Start + 2 union
从FieldValues中选择*,其中GroupId = @Start + 3 union
从FieldValues中选择*,其中GroupId = @Start + 4 union
从FieldValues中选择*,其中GroupId = @Start + 5 union
从FieldValues中选择*,其中GroupId = @Start + 6 union
从FieldValues中选择*,其中GroupId = @Start + 7 union
从FieldValues中选择*,其中GroupId = @Start + 8 union
从FieldValues中选择*,其中GroupId = @Start + 9 union
从FieldValues中选择*,其中GroupId = @Start + 10
注意:由于结果可以缓存,我总是在每个测试之间加扰@Start变量以获得非缓存时间估计
为什么这些多重选择(看起来像一些初学者已经完成)比测试1中更优雅的选择快得多?
答案 0 :(得分:11)
尝试在查询分析器中使用“显示实际执行计划”,您将看到第二个查询可能通过执行索引搜索来实现结果,而前者(较慢)无法执行此操作,因为它不会不知道记录是顺序的,因为它使用的索引是非聚集的。
答案 1 :(得分:2)
由于这些似乎是工会中相互排斥的陈述,我建议工会一切都比工会更好。这将减少服务器的工作量。