SQL Server使用嵌套循环,因为估计的行数很差

时间:2016-08-02 22:08:34

标签: sql-server sql-server-2008-r2 nested-loops temp-tables sql-execution-plan

我使用的是SQL Server 2008 R2。我创建了一个临时表,然后用1000行填充临时表。

Create Table #Temp
(
  ID Int,
  res INT
)

Insert Into #Temp 
VALUES (10004, 2246), (10005, 2246), (10006, 2246), (10007, 2246),
       (10008, 2246), (10009, 2246), (10010, 2246), (10011, 2246),
       (10013, 2246), (10014, 2246), (10015, 2246), (10016, 2246),
       (10017, 2246), (10018, 2246), (10019, 2246), (10020, 2246),
       (10021, 2246), ................ 

我有另一个名为Item的表。它有大约30000条记录。

我在INNER JOIN和临时表之间有一个Item

Select 
    * 
From 
    Inventory.Item 
Inner Join
    #Temp On (#Temp.ID = item.MasterID And MRes = ExRestaurantID)

正如您在下面的三张图片中看到的那样,SQL Server为我的查询创建了一个执行计划,但在他的计划中,它估计我的Item表只有一行,因此它使用了嵌套循环加入。

enter image description here

enter image description here

enter image description here

任何人都知道为什么SQL Server只期望Item表有一行?

1 个答案:

答案 0 :(得分:7)

估计完全正确。

嵌套循环内部有点令人困惑的是,连接估计的行数是每次执行,但实际的行数是在所有执行中聚合的。

估计每次执行1行,执行1,000次,最终实际行数为1,000。

那里没有差异。