为什么SQL Server使用嵌套循环

时间:2012-04-02 17:17:32

标签: sql sql-server-2008

我有查询例如:

SELECT TOP 10 
  User.id,
  User.Name,
  Country.Country
  FROM User  
  Inner Join Country 
  ON Country.Id = User.CountryId
  where User.PlanId = 1

在这种情况下,SQL管理器在执行计划中显示使用Hash-match并且它非常快。

但是,如果我使用的地方User.PlanId = 2 SQL管理器使用嵌套循环进行查询而且速度很慢...为什么不同的搜索条件使用不同的算法?我该如何解决?

1 个答案:

答案 0 :(得分:3)

我猜你的PlanID为2的用户数比用1的人数要多得多。

这将解释exec计划和运行时的变化。 HASH MATCH是最通用(通常效率最低)的连接。基本上,引擎会手动构建一个表来配对所有值。

A NESTED LOOP检查左边的每个值与右边的每个值,并且当一个数据集比另一个数据集大得多并且双方都被编入索引时效果很好。

如果您的数据集非常小,那么HASH MATCH可以很快。我怀疑速度差异是因为数据集的大小不同。您可以通过以下方式轻松检查:

SELECT PlanId, COUNT(*) as CT
FROM User
GROUP BY PlanID

...这将为您提供分发。