在下一次执行开始之前,执行计划的每个成员是否都完整运行?

var*_*ble 1 sql-server execution-plan sql-server-2019

我正在查看执行计划并从右到左阅读它。

例子:

1<-2<-3<-4
      ^
      |_5
Run Code Online (Sandbox Code Playgroud)

所以4和5是并行执行的。当两者都完全完成时,则 3 完全执行,然后 2 完全运行,然后 1。

这是正确的还是可能存在以下情况:

  1. 3 甚至在 4 和 5 完全完成之前就开始执行。

  2. 2 甚至在 3 完全完成之前就开始执行。

Cha*_*ace 6

您误解了这些箭头的含义。它们不代表执行顺序,而是代表数据流。

每个运算符不会完整执行,然后将所有行传递给下一个运算符,除非它是阻塞运算符。它们也不一定意味着它们是并行执行的。

相反,每个运算符一次将一行传递给下一个运算符。连接运算符3将等待 4 中的一行,然后再调用 5 获取其第一行。这称为迭代器。

因此,如果4是阻塞运算符(例如排序),那么它将在内部生成所有行,然后将它们一一传递给3,而 3 又会请求5中的行。如果5处于阻塞状态,那么它就必须等待。

但大多数运算符都不会阻塞,因此通常每一行一次都会经过一个。通过3处的联接从4中获取一行,然后从5中获取一行并联接,如果相关,则从5中获取更多行,然后该过程再次从4中的另一行开始。


如果这是并行计划,则运算符45仅会并行执行。

在并行计划中,数据被分区,每个线程处理部分数据,其方式与串行计划类似。


归档时间:

查看次数:

160 次

最近记录:

4 年,1 月 前