GET_QUERY_OPERATOR_STATS 和 EXPLAIN 函数和命令:由数组表示的父运算符¶
以下命令和函数提供有关查询执行的详细信息:
EXPLAIN、EXPLAIN USING TABULAR 和 EXPLAIN USING JSON (这不影响 EXPLAIN USING TEXT)
这些命令和函数的输出包括有关构成查询的运算符节点树中每个运算符节点的信息。
背景¶
当前,此信息包括用于识别单个父节点的列或属性。此功能不会处理运算符节点有多个父节点的情况。
例如,假设您正在生成以下查询的配置文件:
WITH wv AS (
SELECT a FROM t WHERE a % 2 = 1
)
SELECT a FROM wv WHERE a % 3 = 1
UNION ALL
SELECT a FROM wv WHERE a % 5 = 1;
在此查询的配置文件中,WithClause [4]
节点有多个父节点:

对于上述查询,GET_QUERY_OPERATOR_STATS 和 EXPLAIN 命令和函数的输出具有将 WithReference [3]
识别为父节点 WithClause [4]
的列或属性。但是,存在两个父节点: WithReference [3]
和 WithReference [8]
。
输出变更¶
在当前版本中,父节点的现有列或属性被以下包含父节点 IDs 的数组的列或属性之一所取代:
SQL 命令或函数 |
现有列或属性 |
新列或属性 |
---|---|---|
EXPLAIN 和 SYSTEM$EXPLAIN_PLAN_JSON |
|
|
GET_QUERY_OPERATOR_STATS |
|
|
EXPLAIN 命令和 EXPLAIN_JSON 函数的表输出变更¶
假设您执行了以下语句:
EXPLAIN WITH wv AS (
SELECT a FROM t WHERE a % 2 = 1
)
SELECT a FROM wv WHERE a % 3 = 1
UNION ALL
SELECT a FROM wv WHERE a % 5 = 1;
输出变更如下所述:
- 之前:
输出包括父列,其中包含单个父节点 ID:
+------+------+--------+---------------+ ... | step | id | parent | operation | ... +------+------+--------+---------------+ ... | NULL | NULL | NULL | GlobalStats | ... | 1 | 0 | NULL | Result | ... | 1 | 1 | 0 | UnionAll | ... | 1 | 2 | 1 | Filter | ... | 1 | 3 | 2 | WithReference | ... | 1 | 4 | 3 | WithClause | ... ...
- 现在:
输出包括 parentOperators 列,其中包含父节点 IDs 的数组:
+------+------+-----------------+---------------+ ... | step | id | parentOperators | operation | ... |------+------+-----------------+---------------+ ... | NULL | NULL | NULL | GlobalStats | ... | 1 | 0 | NULL | Result | ... | 1 | 1 | [0] | UnionAll | ... | 1 | 2 | [1] | Filter | ... | 1 | 3 | [2] | WithReference | ... | 1 | 4 | [3, 8] | WithClause | ... ...
对于 EXPLAIN_JSON 函数,如果传递给该函数的计划不包含有关父运算符的信息,则 parentOperators
列将为 NULL。
EXPLAIN 命令和 SYSTEM$EXPLAIN_PLAN_JSON 的 JSON 输出中的变更¶
假设您执行了一条生成查询计划 JSON 输出的语句。例如:
EXPLAIN USING JSON WITH wv AS (
SELECT a FROM t WHERE a % 2 = 1
)
SELECT a FROM wv WHERE a % 3 = 1
UNION ALL
SELECT a FROM wv WHERE a % 5 = 1;
输出变更如下所述:
- 之前:
输出包括父属性,其中包含单个父节点 ID:
{ ... "Operations": [[ ... {"id":1,"parent":0,"operation":"UnionAll"}, {"id":2,"parent":1,"operation":"Filter", ...}, {"id":3,"parent":2,"operation":"WithReference"}, {"id":4,"parent":3,"operation":"WithClause", ...}, ...
- 现在:
输出包括 parentOperators 属性,其中包含父节点 IDs 的数组:
{ ... "Operations":[[ ... {"id":1,"operation":"UnionAll","parentOperators":[0]}, {"id":2,"operation":"Filter",... , "parentOperators":[1]}, {"id":3,"operation":"WithReference","parentOperators":[2]}, {"id":4,"operation":"WithClause",... ,"parentOperators":[3,8]}, ...
GET_QUERY_OPERATOR_STATS 函数输出的变更¶
假设您执行了以下语句:
WITH wv AS (
SELECT a FROM t WHERE a % 2 = 1
)
SELECT a FROM wv WHERE a % 3 = 1
UNION ALL
SELECT a FROM wv WHERE a % 5 = 1;
SET lid = LAST_QUERY_ID();
SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS($lid));
输出变更如下所述:
- 之前:
输出包括 PARENT_OPERATOR_ID 列,其中包含单个父节点 ID:
+-----+---------+-------------+--------------------+---------------+ ... | ... | STEP_ID | OPERATOR_ID | PARENT_OPERATOR_ID | OPERATOR_TYPE | ... +-----+---------+-------------+--------------------+---------------+ ... | ... | 1 | 0 | NULL | Result | ... | ... | 1 | 1 | 0 | UnionAll | ... | ... | 1 | 2 | 1 | Filter | ... | ... | 1 | 3 | 2 | WithReference | ... | ... | 1 | 4 | 3 | WithClause | ... ...
- 现在:
输出包括 PARENT_OPERATORS 列,其中包含父节点 IDs 的数组:
|-----+---------+-------------+------------------+---------------+ ... | ... | STEP_ID | OPERATOR_ID | PARENT_OPERATORS | OPERATOR_TYPE | ... |-----+---------+-------------+------------------+---------------+ ... | ... | 1 | 0 | NULL | Result | ... | ... | 1 | 1 | [ | UnionAll | ... | | | | 0 | | ... | | | | ] | | ... | ... | 1 | 2 | [ | Filter | ... | | | | 1 | | ... | | | | ] | | ... | ... | 1 | 3 | [ | WithReference | ... | | | | 2 | | ... | | | | ] | | ... | ... | 1 | 4 | [ | WithClause | ... | | | | 3, | | ... | | | | 8 | | ... | | | | ] | | ... ...
参考:1175