为什么这个查询在多次选择时更快而不是在两者之间使用?

时间:2009-05-14 12:11:23

标签: sql sql-server tsql sql-server-2008

我在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中更优雅的选择快得多?

2 个答案:

答案 0 :(得分:11)

尝试在查询分析器中使用“显示实际执行计划”,您将看到第二个查询可能通过执行索引搜索来实现结果,而前者(较慢)无法执行此操作,因为它不会不知道记录是顺序的,因为它使用的索引是非聚集的。

答案 1 :(得分:2)

由于这些似乎是工会中相互排斥的陈述,我建议工会一切都比工会更好。这将减少服务器的工作量。