以下是下面查询的简单执行计划。
查询:
SELECT TOP (25) orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
ORDER BY orderid;
执行计划
我的问题是如何理解执行次数
以下是所有运营商的执行次数
嵌套循环:
预计执行次数:1
实际执行次数:1
索引扫描:
预计执行次数:1
实际执行次数:1
密钥查找: 预计执行次数:25 实际执行次数:25
我的问题是 1.为什么嵌套循环只显示1个执行计数
2.Index扫描也只显示一个执行计数,但它在一次执行中得到25行。这些行是存储在行集缓存还是某些缓存中?。嵌套循环从缓存中取一行并调用密钥查找25次每一行
以下是Itzik Ben-Gan的解释
例如,如果告诉它停止的Top迭代器出现在计划的后面,那么索引扫描迭代器如何知道在25行之后停止?答案是内部API调用以根节点开始(在我们的例子中是SELECT迭代器)。此根节点调用Top迭代器。 Top迭代器调用一个方法25次,要求嵌套循环迭代器中的一行。反过来,嵌套循环迭代器调用一个方法25次,要求索引扫描迭代器中的一行。因此,索引扫描迭代器不会超出它扫描的25个第一行。简而言之,虽然通常更直观地遵循数据流顺序来解释计划
但为什么执行计数只显示1.如果我遗漏了任何东西,请告诉我。附件是执行计划
更新(2017年1月):
我已经问了一些关于堆栈溢出的类似问题。请参阅这个答案以获取更多相关详细信息..
https://dba.stackexchange.com/questions/134172/set-statistics-i-o-for-nested-loops
答案 0 :(得分:1)
嵌套循环只执行一次。它执行25次键查找,但这不是嵌套循环操作本身执行次数的计数。
25行来自索引查找,它将它们传递给获取行的缺失数据的键查找,然后将行传递给顶层运算符。当顶级操作员获得25行时,它会告诉其他人停止。我真的不明白缓存问题。当然数据被提取到缓冲池中,但是一旦它可以从一个操作符传递到下一个操作符。