了解执行计划中的执行次数

Understanding Number of Executions in Execution plan

下面是下面查询的简单执行计划。

查询:

SELECT TOP (25) orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
ORDER BY orderid;

执行计划:

我的问题是如何理解执行次数

以下是所有算子的执行次数

嵌套循环:
估计执行次数:1
实际执行次数:1

索引扫描:
估计执行次数:1
实际执行次数:1

密钥查找:
估计执行次数:25
实际执行次数:25

我的问题是

  1. 为什么嵌套循环只显示 1 次执行计数?

  2. 索引扫描也只显示一次执行计数,但一次执行得到 25 行。这些行是存储在 Rowset 缓存中还是某些缓存中?嵌套循环是否会从缓存中取出一行并为每一行调用键查找 25 次?

以下是 Itzik Ben-Gan 的解释

例如,如果告诉它停止的 Top 迭代器稍后出现在计划中,Index Scan 迭代器如何知道在 25 行后停止?答案是内部 API 调用从根节点开始(在我们的例子中是 SELECT 迭代器)。此根节点调用 Top 迭代器。 Top 迭代器调用一个方法 25 次,该方法从 Nested Loops 迭代器中请求一行。反过来,嵌套循环迭代器调用一个方法 25 次,该方法从索引扫描迭代器中请求一行。因此,索引扫描迭代器不会超出它扫描的前 25 行。简而言之,虽然通常按照数据流顺序来解释计划更直观

但为什么执行计数只显示 1。如果我遗漏了什么,请告诉我。附上执行计划

更新(2017 年 1 月):

我问过一些关于堆栈溢出的类似问题。有关相同的更多详细信息,请参阅此答案..

https://dba.stackexchange.com/questions/134172/set-statistics-i-o-for-nested-loops

  1. 嵌套循环只执行一次。它执行 25 次键查找,但这不是嵌套循环操作本身被执行的次数。

  2. 这 25 行来自索引查找,它将它们传递给键查找,键查找获取行的缺失数据,然后将行传递给顶级运算符。当顶级操作员获得 25 行时,它告诉其他操作员停止。我真的不明白缓存问题。当然,数据会被提取到缓冲池中,但一旦可以,它就会从一个操作员传递到下一个操作员。