我在Sql Server 2008 Express中有一个表,其中包含1800万条记录。
结构看起来像这样(简化):
Id,GroupId,值,已创建
ID是具有聚集索引的主键
GroupId是非聚集索引
在这种情况下,每10行将获得一个新的groupId,这意味着记录1-10具有GroupId 1,记录11-20具有GroupId 2,依此类推。
测试1:此查询需要23秒才能运行,并返回99条记录:
声明@Start INT
SET @开始= 1050
从FieldValues中选择*,其中@Start和@Start之间的GroupId为10
测试2:此查询需要0秒才能运行,并返回99条记录:
声明@Start INT
SET @开始= 1050
从FieldValues中选择*,其中GroupId = @Start联合
从FieldValues中选择*,其中GroupId = @Start + 1并集
从FieldValues中选择*,其中GroupId = @Start + 2并集
从FieldValues中选择*,其中GroupId = @Start + 3并集
从FieldValues中选择*,其中GroupId = @Start + 4并集
从FieldValues中选择*,其中GroupId = @Start + 5并集
从FieldValues中选择*,其中GroupId = @Start + 6并集
从FieldValues中选择*,其中GroupId = @Start + 7 union
从FieldValues中选择*,其中GroupId = @Start + 8 union
从FieldValues中选择*,其中GroupId = @Start + 9 union
从FieldValues中选择*,其中GroupId = @Start + 10
注意:由于可以缓存结果,因此我总是在每次测试之间对@Start变量进行加扰,以获取非缓存的时间估算值
为什么这些多项选择(看起来有些初学者已经精疲力尽)比测试1中更优雅的选择要快得多?
最佳答案
尝试在查询分析器中使用“显示实际执行计划”,您将看到第二个查询可能通过执行索引查找来实现结果,而前一个(慢速)无法执行此操作,因为它不知道记录是连续的,因为它使用的索引是非聚集的。