执行计划中的一些特殊数字是什么含义?

执行计划中的一些特殊数字,例如下面的执行计划中的 28 29 31 等感觉是为了识别计划中对应的表或者操作,但是为什么是28 29 不是1或者2之类的,这个是什么意思?

1 个赞

没有什么实际意义,就是一个标识,只是内部实现上给每个算子都分配了一个序号而已。
另外因为存在并行处理的情况,所以也并不完全代表执行的顺序。

跟顺序有关嘛,感觉没关系啊,从来没关注过这个

整体上就是个标识和顺序没关,但仔细看 如果是父子关系的算子大部分还是能代表顺序

这个数字应该不是执行顺序,应该是序号,对本例而言,执行顺序应该是31->32 ->29->30->28->13

我理解就是序号,类似mysql的id或者oracle的id,但是这个序号为什么不是从0 或者1 开始,而是从中间开始呢,而且还少数字?
例如:MySQL执行计划


或者Oracle的执行计划

都是从1或者0开始的,但是TiDB的执行计划序号像是从中间开始的,还有断档,不太理解少的数字是什么?

少的有可能是并行执行的,比如分别在3个tikv上执行,每个tikv需要分一个序号,但是在逻辑上只是一步执行计划,只有一个序号。
或者是内部执行的一些内容分配了序号。

有可能是,但是官方文档没找到任何对应的说明

我理解是标识,数字应该是有意义的,方便我们说明执行计划的真正顺序
(不是数字顺序)。但是TiDB的这个显示很容易让我产生联想,就是中间的数字还做了什么操作?

我平时就当执行大致顺序了。

如果不是顺序,还能表示什么呢 :stuck_out_tongue_winking_eye:

序号肯定不是执行顺序,我理解就是标识, 对本例而言,执行顺序应该是31->32 ->29->30->28->13。
执行顺序非常重要,错误的执行计划很多时候是从第一个执行的开始的,确定执行计划中第一个执行的内容是很重要的。

你说的对,我太想当然了。
正常应该是先build(31->32)构建哈希表再执行probe(29->30)。

执行计划从上到下,从右往左看。我感觉数字的意义不大

感觉是顺序或者表示执行的权重

权重应该是不可能的。

课程里有讲,就是一个标识。

1 个赞

好的,这可以确定是标识,还有另外一个问题,就是标识不连续的问题

这个数字是TiDB集群内部处理一个任务时,在内部实现的过程中给各个算子的标识,这些算子可能根据不同的功能作用进行分类和设置序号。

系统再把与执行计划相关的、要给用户看的其中一部分算子给展示出来,连同数字标识也带出来了。用户在查看执行计划的时候,可以不用理会这些数字序号,从外部看没有多大的意义,只需要关注执行计划的树状结构和执行顺序即可。

4 个赞

好的。对于算子标识,我觉得如果要展示就像mysql id一样顺序展示可能更好。