Cod*_*ker 2 sql t-sql sql-server 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
select*from FieldValues,其中GroupId介于@Start和@Start + 10之间
测试2:此查询需要0秒才能运行并返回99条记录:
DECLARE @启动INT
SET @启动= 1050
SELECT*FROM FieldValues其中的GroupId = @启动联合
SELECT*FROM FieldValues其中的GroupId = @启动+ 1联合
SELECT*FROM FieldValues其中的GroupId = @启动+ 2联合
SELECT*FROM FieldValues其中的GroupId = @启动+ 3联合
SELECT*FROM FieldValues其中的GroupId = @启动+ 4联合
SELECT*FROM FieldValues其中的GroupId = @启动+ 5工会
SELECT*FROM FieldValues其中的GroupId = @启动+ 6联合
SELECT*FROM FieldValues其中的GroupId = @启动
+7 union select*from FieldValues,其中GroupId = @Start + 8 union
select*from FieldValues其中GroupId = @Start + 9 union
select*from FieldValues其中GroupId = @Start + 10
注意:由于结果可以获取缓存我总是争相每次测试获得非缓存时间估计的变量@启动
为什么这些多重选择(这看起来有些初学者也throught了)去这样不是更优雅的一个测试快得多1?
Ber*_*ann 11
尝试在查询分析器中使用"显示实际执行计划",您将看到第二个查询可能通过执行索引查找来实现结果,而前者(较慢)无法执行此操作,因为它不知道记录是顺序的,因为它使用的索引是非聚集的.