我使用的是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
表只有一行,因此它使用了嵌套循环加入。
任何人都知道为什么SQL Server只期望Item表有一行?
答案 0 :(得分:7)
估计完全正确。
嵌套循环内部有点令人困惑的是,连接估计的行数是每次执行,但实际的行数是在所有执行中聚合的。
估计每次执行1行,执行1,000次,最终实际行数为1,000。
那里没有差异。