1

我使用SQL Server 2008 R2。我创建了一个临时表,并用1000行填充我的临时表。由于预计行数不好,SQL Server使用嵌套循环

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 JOINItem和我的临时表。

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

正如你可以在下面三张图片看,SQL服务器已经创建了一个执行计划为我的查询,但在他的计划中,估计,我Item表只有一个行的,因为它使用了嵌套循环加入。

enter image description here

enter image description here

enter image description here

剂量人知道为什么SQL Server有预期的项目表只是一个行?

+1

它估计扫描将返回1000行1次,并估计搜索将返回1行1000次。两个估计都是正确的。 – GSerg

回答

7

估算值完全正确。

有点混乱的嵌套循环内部加入行的估计数是每次执行但实际的行数跨的所有汇总执行。

它估计每执行1行和1,000执行,并且最终实际行数为1,000。

那里没有差异。