为什么SQL Server使用嵌套循环

Ren*_*eno 5 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,SQL管理器在执行计划中显示使用哈希匹配并且它非常快.

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

JNK*_*JNK 3

我猜测,a 为PlanID2 的用户数量比 1 的用户数量要多得多。

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

ANESTED LOOP将左侧的每个值与右侧的每个值进行检查,当一个数据集比另一个数据集大很多并且两侧都建立了索引时,该方法效果很好。

HASH MATCH不过,如果您的数据集非常小,A可能会很快。我怀疑速度差异是由于数据集大小不同造成的。您可以通过以下方式轻松检查:

SELECT PlanId, COUNT(*) as CT
FROM User
GROUP BY PlanID
Run Code Online (Sandbox Code Playgroud)

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