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

Ard*_*oli 1 sql-server temp-tables nested-loops sql-server-2008-r2 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), ................ 
Run Code Online (Sandbox Code Playgroud)

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

我有一个INNER JOIN介于Item我和临时表之间.

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

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

在此输入图像描述

在此输入图像描述

在此输入图像描述

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

Mar*_*ith 7

估计完全正确.

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

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

那里没有差异.