最近正学习达梦数据库的SQL审核逻辑,执行计划是重要的路径,官方文档给出了相关执行计划操作符的讲解,和Oracle有些差异,例如达梦默认标的组织结构是索引组织表,和MySQL相同,所以相对于Oracle的全表扫描,达梦对应的是聚集索引扫描,像这种应该是比较关注的一种场景,给出的讲解比较全面了。
但是不同的数据库一些设计细节上还是略有差别,例如Oracle会存储SQL原文,一种是限定长度的存储(sql_text,VARCHAR2(1000)),超过就截断,另一种是通过CLOB存储,基本上能存储任意的SQL语句了。
但是达梦数据库,默认v$sql_history中的top_sql_text限制存储1000字节,v$sqltext中的sql_text限制存储7168字节,如果要存储原文,需要开启参数,但可能生产环境默认是不开启的。
https://eco.dameng.com/document/dm/zh-cn/pm/dm8-admin-manual-appendix4.htmlhttps://wxa.wxs.qq.com/tmpl/og/base_tmpl.html
| 操作符名称 | 参数说明 | 操作说明 |
| AAGR2 | grp_num:分组项个数 | 简单聚集。如果没有分组,则直接计算集函数 |
| sfun_num:返回上层操作符的集函数个数 | ||
| distinct_flag:集函数参数是否去重 | ||
| slave_empty:是否限制MPP从节点向主节点传送数据,或本地并行的从线程向主线程传送数据。取值:0:不限制;1:不允许MPP从节点向主节点传送数据;2:不允许本地并行的从线程向主线程传送数据 | ||
| dist_arg_opt参数:标记是否做distinct优化(分组项+该distinct参数 刚好组成aagr/sagr使用索引的前导列,那么计算该参数的dist时无需使用hash表,直接相邻行比较即可(分组项组内参数已有序)),dist_arg_opt(a1,a2,…an),a对应每个distinct参数,取值0代表此distinct参数不优化计算,反之则为1 | ||
| ACTRL | 无参数 | 使用自适应计划机制时,控制备用计划转换 |
| AFUN | afun_num:分析函数个数 | 分析函数计算 |
| partition_num:分区项个数 | ||
| [colnamelist]:分区项 | ||
| order_num:排序项个数 | ||
| [colnamelist]:排序项 | ||
| ASCN | tabname:表的别名 | 数组当作表来扫描 |
| used_in_sss3:是否出现在sss3(subquery set search,子查询集合查找)指令中。值为TRUE时,则每次扫描都重新开始 | ||
| ASSERT | assert_condition:触发断言的布尔表达式条件 | 约束检查 |
| BLKUP2 | idxname(tabname) :索引名(表名)。use_clu_addr:是否从二级索引记录读取对应的聚集索引记录地址对定位聚集索引记录进行优化 | 定位查找 |
| BMAND | 无参数 | 位图索引的与运算 |
| BMCNT | is_match_out:是否直接根据孩子节点的MATCH-COUNT值计算COUNT(*) | 位图索引的行数计算 |
| BMCVT | 无参数 | 位图索引的ROWID转换 |
| BMMG | 无参数 | 位图索引归并 |
| BMOR | 无参数 | 位图索引的或运算 |
| BMSEK | scan_type:扫描类型 | 位图索引的范围查找 |
| idxname(tabname) :索引名(表名) | ||
| scan_range:扫描范围 | ||
| CONST VALUE LIST | row_num:常量列表行数 | 常量列表 |
| col_num:常量列表列数 | ||
| CONSTC | N_PRE_VAR:复合索引跳跃扫描中跳跃扫描的索引前导列个数 | 用于复合索引跳跃扫描 |
| (out_var):外部var变量序列 | ||
| CSCN2 | idxname(tabname) :索引名(表名) | 聚集索引扫描 |
| NEED_SLCT(TRUE):是否进行过滤条件下推的优化 | ||
| btr_scan:等于1表示使用B树扫描,等于0表示使用簇游标扫描 | ||
| SAMPLE标记:用于标记节点上是否存在sample表达式,存在则带有此标记,否则无 | ||
| CSEK2 | scan_type:扫描类型 | 聚集索引数据定位 |
| idxname(tabname) :索引名(表名) | ||
| scan_range:扫描范围 | ||
| CTE_SCN | exp_num:映射列数 | 递归WITH查询 |
| (queryname):查询名 | ||
| CTNS | idxname(tabname) :索引名(表名) | 用于实现全文索引的CONTAINS |
| KEY:全文索引的关键词 | ||
| DELETE | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | 删除数据 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:删除类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| DELETE_REMOTE | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | DBLINK删除操作 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:删除类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| DISTINCT | keys:MPP模式下需要分发的列的信息(仅在MPP模式下生效) | 去重 |
| L_FULL_OPT_SEMI标记:semi半连接支持l_full优化 | ||
| L_FULL_OPT_ANTISEMI标记:anti semi连接支持l_full优化 | ||
| L_FULL_OPT_JOIN标记:其他非semi连接支持l_full优化 | ||
| DSCN | idxname(tabname) :索引名(表名) | 动态视图表扫描 |
| DSSEK | scan_type:扫描类型 | DISTINCT列上索引跳跃扫描(单列索引或复合索引) |
| idxname(tabname) :索引名(表名) | ||
| scan_range:扫描范围 | ||
| ESCN | 无参数 | 外部表扫描 |
| EXCEPT | 无参数 | 集合的差运算,且取差集后删除重复项 |
| EXCEPT ALL | 无参数 | 集合的差运算,且取差集后不删除重复项 |
| EHFD | mpp_opt:数据操作方式,1:数据直接发送给BP端进行删除;0:通过SP端分发 | DPC下事务型HUGE表的数据删除 |
| EHFI | (tabname):表名 | DPC下事务型HUGE表的数据插入 |
| mpp_opt:数据操作方式,1:数据直接发送给BP端进行插入;0:通过SP端分发 | ||
| EHFINS | (tabname):表名 | DPC下非事务型HUGE表的数据插入 |
| mpp_opt:数据操作方式,1:数据直接发送给BP端进行插入;0:通过SP端分发 | ||
| EHFU | mpp_opt:数据操作方式,1:数据直接发送给BP端进行更新;0:通过SP端分发 | DPC下事务型HUGE表的数据更新 |
| ERECV | stask_no:自身所处的子任务的序号,-1表示root子任务 | DPC下用于接收数据,和ESEND对应 |
| l_stask_no:孩子子计划的序号 | ||
| n_keys:归并排序的key的个数 | ||
| in_turn:是否按照顺序接收各个发送端的数据 | ||
| trig:是否在IDU(增删改操作)上存在触发器 | ||
| PV_FLAG:为1时开启限流,严格一发一收 | ||
| topN标记:存在此标记则代表erecv节点上含有top语句 | ||
| ESEND | stask_no:自身所处的子任务的序号,-1表示root子任务 | DPC下用于发送数据,和ERECV对应 |
| type:发送类型,用于确定基于何种数据特征对数据进行分发。详细介绍请参考《DM8分布计算集群》5.4小节“数据交换与数据迭代操作符” | ||
| sites:站点的RAFT ID和并行度值,“-”表示空。例如(1:3,2:4)表示RAFT ID 1的并行度为3,RAFT ID 2的并行度为4 | ||
| sql_invoke:当前子任务是否包含了含sql的函数调用 | ||
| pwj_opt:是否使用了分区智能连接(Partition Wise Join)优化 | ||
| table:表名,“-”表示空,不为空时表示按照该表的分区定义进行数据分发 | ||
| empty_type:当哈希连接相关优化的分发计算无合适接收端时的处理策略,取值:INIT:未指定策略,效果等同于ERROR;PRUNE:直接抛弃;ANY:给任意线程处理;ERROR:报错;NOT_EMPTY:通知所有线程右孩子不为空集 | ||
| keys:表的分发列(仅当table不为空时显示) | ||
| INFO_BITS:相关优化信息的标志位,6个标志位自低向高含义如下:bit0:是否在哈希连接左表为广播数据时共享哈希表;bit1:是否使用UNIONALL优化;bit2:是否选择开始执行任务;bit3:是否进行链路发送优化;bit4:是否进行归并排序的链路发送优化;bit5:用于指示当前ESEND发送的目标进行归并排序 | ||
| PV_FLAG:为1时开启限流,严格一发一收 | ||
| PI标记:存在此标记则代表esend是并行插入的esend | ||
| FAGR2 | sfun_num:返回上层操作符的集函数个数 | 快速聚集,如果没有where条件,且取count(*), 或者基于索引的MAX/MIN值,则可以快速取得集函数的值 |
| idxname:索引名 | ||
| FILL BTR | index_id:用于填充B树的索引ID | 填充B树 |
| FTTS | for_mdis:是否从MPP DISTRIBUTE获得数据 | MPP\LPQ下,对临时表的优化 |
| GI | policy:指示表的数据访问粒度,各个取值和含义请参考《DM8分布计算集群》中5.4小节“数据交换与数据迭代操作符” | Granule Iterator,在DMDPC集群中,控制各工作线程的数据访问粒度和分区表裁剪 |
| gi_unit:当前GI迭代器控制的数据扫描操作符起止序号 | ||
| scan_type[0]:扫描相关信息,格式为:[扫描类型,反向扫描信息(可选),末尾KEY优化信息(可选)] | ||
| dynamic_pll:是否包含动态裁剪 | ||
| has_hp_col_filter标记:用于标记下放是否包含有slct, 且slct仅包含范围分区列的过滤(is_hp_col_filter == TRUE)。has_hp_col_filter(n)中的n表示GI节点下所有叶子操作符属性has_hp_col_filter==TRUE的数目 | ||
| HAGR2 | grp_num:分组项个数 | HASH分组,并计算集函数 |
| sfun_num:返回上层操作符的集函数个数 | ||
| distinct_flag:集函数参数是否去重 | ||
| top_num:是否只返回前N组 | ||
| slave_empty:是否限制MPP从节点向主节点传送数据,或本地并行的从线程向主线程传送数据。取值:0:不限制;1:不允许MPP从节点向主节点传送数据;2:不允许本地并行的从线程向主线程传送数据 | ||
| keys:分组项 | ||
| real_keys:依赖分组优化中实际使用的分组列 | ||
| HASH FULL JOIN2 | key_num:等值连接条件数 | HASH全外连接 |
| mix_aggr:是否将分组操作下放到此步骤进行,仅支持COUNT和SUM函数 | ||
| mix_dist:是否存在对分组操作和哈希左外连接的优化(即把分组操作下放到哈希左外连接中) | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| HASH LEFT JOIN2 | key_num:等值连接条件数 | HASH左外连接 |
| partition_keys_num:paritition outer join的KEY个数 | ||
| ret_null:是否仅返回未匹配的行 | ||
| mix:需要计算的单个右表列的COUNT函数个数 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| HASH LEFT SEMI JOIN12 | (ANTI):是否为反连接 | HASH左半连接,其与HASH LEFT_SEMI_JOIN2的区别是该计划为semi join with rowid key,后者是semi join with exp key |
| join_condition:连接条件 | ||
| HASH LEFT SEMI JOIN2 | (ANTI):是否为反连接 | HASH左半连接 |
| key_num:等值连接条件数 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| HASH LEFT SEMI MULTIPLE JOIN | (ANTI):是否为反连接 | 多列NOT IN |
| join_condition:连接条件 | ||
| HASH RIGHT JOIN2 | key_num:等值连接条件数 | HASH右外连接 |
| ret_null:是否仅返回未匹配的行 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| HASH RIGHT SEMI JOIN2 | key_num:等值连接条件数 | HASH右半连接 |
| (ANTI):是否为反连接 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| INFO_BITS:相关优化信息的标志位,其中bit0指明是否在左表为广播数据时共享0号工作节点哈希表 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| HASH RIGHT SEMI JOIN32 | (any_options):取值包括:“= all”、“<> any”、“op all”、“op any” | 用于OP SOME/ANY/ALL的HASH右半连接 |
| key_num:等值连接条件数 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| HASH2 INNER JOIN | (UNIQUE_FLAG):该连接中左右表数据的唯一性策略。取值:LRKEY_UNIQUE:左右表数据分别根据各自KEY值唯一;LKEY_UNIQUE:左表数据根据KEY值唯一,右表则不唯一;RKEY_UNIQUE:右表数据根据KEY值唯一,左表则不唯一 | HASH内连接 |
| key_num:等值连接条件数 | ||
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| INFO_BITS:相关优化信息的标志位,6个标志位自低向高含义如下:bit0:是否在哈希连接左表为广播数据时共享0号工作节点的哈希表;bit1:是否使用UNIONALL优化;bit2:是否选择开始执行任务;bit3:是否进行链路发送优化;bit4:是否进行链路发送优化,且需要进行归并;bit5:用于指示当前ESEND发送的目标进行归并排序 | ||
| HEAP TABLE | stask_no:子任务的序号,-1表示root子任务 | 临时结果表 |
| sql_invoke:是否已在所属子计划进行含sql的函数调用 | ||
| table_no:临时结果表编号 | ||
| full:并行场景数据完整性,取值:0:局部数据;1:完整数据 | ||
| mpp_full:是否在MPP/DPC模式下表示完整数据 | ||
| autoid:是否生成autoid列 | ||
| sites:站点的ID和并行度序列,“-”表示空。例如(1:3,2:4)表示1号站点并行度3,2号站点并行度4 | ||
| HEAP TABLE SCAN | table_no:临时结果表编号 | 临时结果表扫描 |
| HFD | mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | 删除事务型HUGE表数据 |
| HFDEL | mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | 删除非事务型HUGE表数据 |
| HFI | (tabname):表名 | 事务型HUGE表插入记录 |
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| HFI2 | (tabname):表名 | MPP模式下优化的事务型HUGE表插入记录 |
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| HFINS2 | mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | 非事务型HUGE表插入记录 |
| HFINS3 | 无参数 | MPP模式下优化的非事务型HUGE表插入记录 |
| HFINS4 | 无参数 | 非MPP模式下,针对非事务型HUGE水平分区主表的插入优化,需要参数HFINS_PARALLEL_FLAG=2 |
| HFLKUP | (tabname):表名 | 根据ROWID检索非事务型HUGE表数据 |
| HFLKUP2 | (tabname):表名 | 根据ROWID检索事务型HUGE表数据 |
| HFS UPDATE | table:表名 | 更新非事务型HUGE表数据 |
| type:类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| HFSCN | (tabname):表名 | 非事务型HUGE表的逐行扫描 |
| SAMPLE标记:用于标记节点上是否存在sample表达式,存在则带有此标记,否则无 | ||
| HFSCN2 | (tabname):表名 | 事务型HUGE表的逐行扫描 |
| NEED_SLCT(TRUE):是否进行过滤条件下推的优化 | ||
| SAMPLE标记:用于标记节点上是否存在sample表达式,存在则带有此标记,否则无 | ||
| HFSEK | (tabname):表名 | 根据KEY检索非事务型HUGE表数据 |
| scan_type:扫描类型 | ||
| scan_range:扫描范围 | ||
| SAMPLE标记:用于标记节点上是否存在sample表达式,存在则带有此标记,否则无 | ||
| HFSEK2 | (tabname):表名 | 根据KEY检索事务型HUGE表数据 |
| scan_type:扫描类型 | ||
| scan_range:扫描范围 | ||
| SAMPLE标记:用于标记节点上是否存在sample表达式,存在则带有此标记,否则无 | ||
| HFU | table:表名 | 更新事务型HUGE表数据 |
| type:类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| HIERARCHICAL QUERY | (UNIQUE):结果集是否去重 | 层次查询 |
| key_num:等值连接条件数 | ||
| connect_by_condition:连接条件 | ||
| HPM | order_keys:排序项 | 水平分区表归并排序 |
| is_distinct:是否对排序结果进行去重操作 | ||
| top_flag:是否有TOP子句需要处理 | ||
| pll_scan_type:并行处理时扫描相关信息,格式为:[扫描类型,反向扫描信息(可选),末尾KEY优化信息(可选)] | ||
| pll_keys:并行处理时分区列计算表达式相关信息,格式为:(分区列的计算表达式中相等的个数,分区列的计算表达式中最后一列起始的个数,分区列的计算表达式中最后一列终止的个数) | ||
| INDEX JOIN LEFT JOIN2 | join_condition:连接条件 | 索引左连接 |
| ret_null:是否仅返回未匹配的行 | ||
| INDEX JOIN SEMI JOIN2 | (ANTI):是否为反连接 | 索引半连接 |
| join_condition:连接条件 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| INSERT | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | 插入记录 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:插入类型,取值:UNKNOWN、VALUES、SELECT、MVALUE | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| INSERT_LIST | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | 堆表插入 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:插入类型,取值:UNKNOWN、VALUES、SELECT、MVALUE | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| INSERT_REMOTE | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | DBLINK插入操作 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:插入类型,取值:UNKNOWN、VALUES、SELECT、MVALUE | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| INSERT3 | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | MPP模式下查询插入优化处理 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:插入类型,取值:UNKNOWN、VALUES、SELECT、MVALUE | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| mpp_opt:MPP模式下插入优化选项,取值:-1:不优化,DPC环境下取该值;0:不优化,无优化或非MPP环境下取该值;1:在随机插入目标表时分发整个插入计划;2:基于1的特性,省略MDIS分发 | ||
| INTERSECT | 无参数 | 集合的交运算,且取交集后删除重复项 |
| INTERSECT ALL | 无参数 | 集合的交运算,且取交集后不删除重复项 |
| LOCAL BROADCAST | op_id:本地并行模式下节点所属通讯操作符中的序号 | 本地并行模式下,消息广播到各线程,包含必要的集函数合并计算 |
| LOCAL COLLECT | op_id:本地并行模式下节点所属通讯操作符中的序号 | 本地并行模式下数据收集处理,代替LOCAL GATHER |
| n_grp_by:分组列个数 | ||
| n_cols:输出列个数 | ||
| n_keys:分发列的个数 | ||
| for_sync:该操作符是否仅用于同步 | ||
| LOCAL DISTRIBUTE | op_id:本地并行模式下节点所属通讯操作符中的序号 | 本地并行模式下,消息各线程的相互重分发 |
| n_keys:分发列的个数 | ||
| n_grp:分组列个数 | ||
| flt_only:是否只需过滤非当前站点。各站点均拥有完整数据时,分发时只需要过滤掉非当前站点的数据 | ||
| flt_site_data:是否需要过滤站点数据,仅当参数flt_only为TRUE时生效 | ||
| pipe_mode(TRUE):是否可优化分区表 | ||
| n:本地并行工作的线程数 | ||
| fbtr_flag:是否用于fbtr(fast insert b tree)。是则为fbtr_flag(1),否则为fbtr_flag(0) | ||
| LOCAL GATHER | op_id:本地并行模式下节点所属通讯操作符中的序号 | 本地并行模式下,消息收集到主线程 |
| n_grp_by:分组列个数 | ||
| n_cols:输出列个数 | ||
| n_keys:分发列的个数 | ||
| invoke_flag:是否在父亲节点存在函数调用的表达式计算。值为TRUE时从EP不执行该计算且直接丢弃儿子节点相关数据 | ||
| top_flag:是否有TOP子句需要处理 | ||
| LOCAL SCATTER | op_id:本地并行模式下节点所属通讯操作符中的序号 | 本地并行模式下,主线程向各从线程广播消息 |
| notify_only:邮件是否携带通知标记 | ||
| LOCK TID | 无参数 | 上锁 |
| LSET | 无参数 | DBLINK查询结果集 |
| MERGE INNER JOIN3 | key_num:等值连接条件数 | 归并内连接 |
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| MERGE SEMI JOIN3 | (ANTI):是否为反连接 | 归并半连接 |
| join_condition:连接条件 | ||
| KEY:等值连接条件 | ||
| KEY_NULL_EQU:连接列的NULL值比较策略。取值:0:NULL与NULL不相等;1:NULL与NULL相等。例如:(0,1,0)表示第1个和第3个连接条件中NULL值视为不等,第2个连接条件中NULL值视为相等 | ||
| MPP BROADCAST | op_id:MPP模式下节点所属通讯操作符中的序号 | MPP模式下,消息广播到各站点,包含必要的集函数合并计算 |
| MPP COLLECT | op_id:MPP模式下节点所属通讯操作符中的序号 | 用于替换顶层MPP GATHER,除了收集数据到主节点,还增加主从节点间的同步执行功能,防止从节点不断发送数据到主节点造成邮件堆积 |
| n_grp_by:分组列个数 | ||
| n_cols:输出列个数 | ||
| n_keys:分发列的个数 | ||
| for_sync:该操作符是否仅用于同步 | ||
| MPP DISTRIBUTE | op_id:MPP模式下节点所属通讯操作符中的序号 | MPP模式下,消息各站点的相互重分发 |
| n_keys:分发列的个数 | ||
| n_grp:分组列个数 | ||
| filter:是否只需过滤非当前站点。各站点均拥有完整数据时,分发时只需要过滤掉非当前站点的数据 | ||
| rowid_flag:是否根据rowid信息获取站点号进行分发 | ||
| n:参与计算的站点数,值为0时表示其与EP个数一致 | ||
| slave_empty:是否限制MPP从节点向主节点传送数据,或本地并行的从线程向主线程传送数据。取值:0:不限制;1:不允许MPP从节点向主节点传送数据;2:不允许本地并行的从线程向主线程传送数据 | ||
| fbtr_flag:是否用于fbtr(fast insert b tree)。是则为fbtr_flag(1),否则为fbtr_flag(0) | ||
| MPP GATHER | op_id:MPP模式下节点所属通讯操作符中的序号 | MPP模式下,消息收集到主站点 |
| n_grp_by:分组列个数 | ||
| n_cols:输出列个数 | ||
| n_keys:分发列的个数 | ||
| invoke_flag:是否在父亲节点存在函数调用的表达式计算。值为TRUE时,从EP不执行该计算且直接丢弃儿子节点相关数据 | ||
| top_flag:是否有TOP子句需要处理 | ||
| MPP SCATTER | op_id:MPP模式下节点所属通讯操作符中的序号 | MPP模式下,主站点向各从站点广播消息 |
| MSYNC | op_id:MPP模式下节点所属通讯操作符中的序号 | MPP模式下,数据同步处理 |
| MVCC CHECK | 无参数 | 多版本检查 |
| NCUR2 | cursorname:游标名 | 游标操作 |
| NEST LOOP FULL JOIN2 | join_condition:连接条件 | 嵌套循环全外连接 |
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| NEST LOOP INDEX JOIN2 | join_condition:连接条件 | 索引内连接 |
| NEST LOOP INNER JOIN2 | join_condition:连接条件 | 嵌套循环内连接 |
| [with_var]:嵌套连接是否使用var方式 | ||
| NEST LOOP LEFT JOIN2 | join_condition:连接条件 | 嵌套循环左外连接 |
| [with_var]:嵌套连接是否使用var方式 | ||
| partition_keys_num:paritition outer join的KEY个数 | ||
| ret_null:是否仅返回未匹配的行 | ||
| NEST LOOP SEMI JOIN2 | (ANTI):是否为反连接 | 嵌套循环半连接 |
| join_condition:连接条件 | ||
| [with_var]:嵌套连接是否使用var方式 | ||
| (colidlist):与var变量相关的左表列序号序列。例如(0,1,3)表示三个var变量依次来自左表的第1、2、4列 | ||
| flt_batch_exec标记:节点上是否存在filter的批量指令,存在则为flt_batch_exec(1),否则为flt_batch_exec(0) | ||
| NSET2 | 无参数 | 结果集收集,一般是查询计划的顶层节点 |
| NTTS2 | for_mdis:是否从MPP DISTRIBUTE获得数据 | 临时表,临时存放数据 |
| is_atom:是否要求单行数据 | ||
| PARALLEL | scan_type:分区表子分区裁剪方式。其返回值为FULL表示所有子分区裁剪,EQU表示等值子分区裁剪,NULL EQU表示空值子分区裁剪,GE_LE表示闭区间裁剪,G_LE表示左开右闭区间裁剪,GE_L表示左闭右开区间裁剪,G_L表示开区间裁剪,GE表示左闭区间裁剪,LE表示右闭区间裁剪,G表示左开区间裁剪,L表示右开区间裁剪,CONTAIN表示等值全文索引扫描,NOT CONTAIN表示空值全文索引扫描V_AND表示列存储表上的多列rowid AND 后查找,REMOTE表示dblink的远程查询,BITMAP表示位图索引扫描,IN LIST表示分区表首列in list优化扫描,BITMAP JOIN表示位图连接索引扫描,INDEX SKIP表示索引跳读(用于复合索引,过滤条件缺少前导列情况),-表示扫描条件缺失 | 控制水平分区子表的扫描 |
| key_num:分区列计算表达式相关信息,格式为:(分区列的计算表达式中相等的个数,分区列的计算表达式中最后一列起始的个数,分区列的计算表达式中最后一列终止的个数) | ||
| simple:是否对包含单分区列的一级分区表进行等值查询优化 | ||
| range_sfun_opt:aagr+pll+cscn对于range分区列求min/max时的优化标记,若做了优化则为range_sfun_opt(1),否则为range_sfun_opt(0) | ||
| PIPE2 | 无参数 | 管道。PIPE2操作符仅对左孩子的数据进行过滤处理,在左孩子的处理过程中,会触发PIPE2操作符的右孩子节点执行,并用左孩子数据与之进行匹配过滤 |
| PRJT2 | exp_num:映射列数 | 关系的“投影”(project)运算,用于选择表达式项的计算 |
| is_atom:是否要求单行数据 | ||
| PSCN | 无参数 | 批量参数当作表来扫描 |
| REMOTE SCAN | tabname@dblink_name:表名@dblink连接名 | DBLINK远程表扫描 |
| alias_name:表的别名 | ||
| condition参数:用于展示dblink发送给远程的过滤条件 | ||
| RN | 无参数 | 实现ROWNUM查询 |
| RNSK | (rownum_exp):与rownum相关的过滤条件 | ROWNUM作为过滤条件时的计算处理 |
| SAGR2 | grp_num:分组项个数 | 如果输入流是有序的,则使用流分组,并计算集函数 |
| sfun_num:返回上层操作符的集函数个数 | ||
| distinct_flag:集函数参数是否去重 | ||
| top_num:是否只返回前N组 | ||
| slave_empty:是否限制MPP从节点向主节点传送数据,或本地并行的从线程向主线程传送数据。取值:0:不限制;1:不允许MPP从节点向主节点传送数据;2:不允许本地并行的从线程向主线程传送数据 | ||
| keys:分组项 | ||
| opt_num(n):内层分组项中前n项可以直接代表外层分组项 | ||
| dist_arg_opt参数:标记是否做distinct优化(分组项+该distinct参数 刚好组成aagr/sagr使用索引的前导列,那么计算该参数的dist时无需使用hash表,直接相邻行比较即可(分组项组内参数已有序)),dist_arg_opt(a1,a2,…an),a对应每个distinct参数,取值0代表此distinct参数不优化计算,反之则为1 | ||
| SELECT INTO2 | 无参数 | 查询插入 |
| SET TRANSACTION | writeable:是否为可更新事务 | 事务操作(START除外) |
| iso_level:事务隔离级别,取值:READ UNCOMMITTED:读未提交;READ COMMITTED:读提交;SERIALIZABLE:串行化 | ||
| SLCT2 | (condition):过滤条件 | 关系的“选择”(select)运算,用于查询条件的过滤 |
| SLCT_PUSHDOWN(TRUE):是否进行过滤条件下推的优化 | ||
| SORT3 | key_num:排序列个数 | 排序 |
| partition_key_num:已经有序的前导排序列个数 | ||
| is_distinct:排序时是否进行去重操作 | ||
| top_flag:是否返回排序后的N行 | ||
| is_adaptive:是否使用排序的自适应优化(即当下层数据有序时,此次排序实际不进行) | ||
| can_discard:意义为xsort节点是否能被摘除(排序操作符在存在can_discard标记的情况下以管道模式执行, 直接上传左孩子数据) | ||
| SPL2 | stask_no:子任务的序号,-1表示root子任务 | 临时表。和NTTS2不同的是,它的数据集不向父亲节点传送,而是被编号,用编号和KEY来定位访问;而NTTS2的数据,主动传递给父亲节点 |
| key_num:包含ROWID在内的KEY数 | ||
| spool_num:SPOOL临时表编号 | ||
| is_atom:是否限制只能产生单行结果 | ||
| has_var:外层传入变量存在性探测结果(相关查询需探测外层传入变量) | ||
| sites:站点的ID和并行度序列,“-”表示空。例如:(1:3,2:4)表示1号站点并行度3,2号站点并行度4 | ||
| result_cache:执行结果缓存机制,仅在has_var=1时有效,保存var和结果的关系,当下次相同var传入时,无需执行,直接返回保存的结果即可 | ||
| SSCN | idxname(tabname) :索引名(表名) | 直接使用二级索引进行扫描 |
| btr_scan:等于1表示使用B树扫描,等于0表示使用簇游标扫描 | ||
| is_global:等于1时表示使用全局索引 | ||
| SSEK2 | scan_type:扫描类型 | 二级索引数据定位 |
| idxname(tabname) :索引名(表名) | ||
| scan_range:扫描范围 | ||
| is_global:等于1时表示使用全局索引 | ||
| START TRANSACTION | writeable:是否为可更新事务 | 启动会话 |
| iso_level:事务隔离级别,取值:READ UNCOMMITTED:读未提交;READ COMMITTED:读提交;SERIALIZABLE:串行化 | ||
| STAT | 无参数 | 统计信息计算 |
| TOPN2 | top_num:TOP子句的行数表达式 | 取前N条记录 |
| top_off:top_num的偏移量。例如:op_off=3、top_num=4时,从第3行后开始,取第4到第7共4行结果 | ||
| top_percent:top_num的百分比。例如:top_percent=0.5、top_num=100时,取前50行结果(参数top_off和top_percent不会同时出现) | ||
| UFLT | IS_TOP_1:是否在更新操作时相同ROWID只保留1条记录,防止碰到重复数据报错。取值:FALSE:重复数据报错;FIRST:重复数据保留第一行;LAST:重复数据保留最后一行 | 处理UPDATE FROM子句 |
| UNION | 无参数 | UNION计算 |
| UNION ALL | CTE:递归WITH查询名 | UNION ALL运算 |
| UNION ALL(MERGE) | merge_type:排序方式,取值:A:升序排列;D:降序排列;L:升序排列,NULL值结果排在末尾;1:降序排列,NULL值结果排在末尾 | UNION ALL运算(使用归并) |
| n_merge_keys:表的列数 | ||
| UNION FOR OR(MERGE) | merge_type:排序方式,取值:A:升序排列;D:降序排列;L:升序排列,NULL值结果排在末尾;1:降序排列,NULL值结果排在末尾 | OR过滤的UNION计算(使用归并) |
| n_merge_keys:表的列数 | ||
| n_dist_keys:去重的列数 | ||
| UNION FOR OR2 | key_num:需要进行去重操作的列数 | OR过滤的UNION计算 |
| outer_join:UNION操作的外连接类型,取值:L:左外连接;R:右外连接;F:全外连接;-:非外连接 | ||
| UPDATE | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | 更新数据 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:更新类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| UPDATE_REMOTE | (partition_type):分区类型,取值:Vertical Partition:垂直分区;Horizon Partition:水平分区;为空表示不分区 | DBLINK更新操作 |
| table:表名或视图名,“-”表示空,使用远程操作时会增加“@”+“dblink连接名”作为后缀 | ||
| type:更新类型,取值:SELECT、CURSOR | ||
| mpp_opt:是否通过发送整个计划实现对MPP处理的优化 | ||
| hp_opt:是否进行分区列等值过滤优化 | ||
| MODEL | cell_references:MODEL所有不同的单元格引用表达式的数量 | MODEL子句 |
| sorted:当可以使用key进行二分搜索或者model唯一性模式为:检查维度的所有组合值对应单元格的唯一性时,sorted(1),否则sorted(0) | ||
| MERGE INTO | 无参数 | 合并数据 |
声明:来自bisal的个人杂货铺,仅代表创作者观点。链接:https://eyangzhen.com/3536.html