云服务器内容精选

  • 其他算子 其他算子包括Stream算子,以及RemoteQuery等算子。Stream算子主要有三种类型:Gather stream、Broadcast stream及Redistribute stream。 Gather stream:每个源节点都将其数据发送给目标节点进行汇聚。 Broadcast stream:由一个源节点将其数据发给N个目标节点进行运算。 Redistribute stream:每个源节点将其数据根据连接条件计算Hash值,根据重新计算的Hash值进行分布,发给对应的目标节点。 表5 其他算子 算子 含义 场景 Stream 多节点数据交换 执行分布式查询计划,节点间存在数据交换。 Partition Iterator 分区迭代器 分区表扫描,迭代扫描每个分区。 RowToVec 行转列 行列混合场景。 DfsScan / DfsIndexScan HDFS表(索引)扫描 HDFS表扫描。
  • 控制算子 控制算子是一类用于处理特殊情况的节点,用于实现特殊的执行流程。 表4 控制算子 算子 含义 场景 Result 直接进行计算 1. 不包含表扫描。 2. INSERT语句中只有一个VALUES子句。 ModifyTable INSERT/UPDATE/DELETE上层节点 INSERT/UPDATE/DELETE Append 追加 1. UNION(ALL)。 2. 继承表。 MergeAppend 追加(输入有序) 1. UNION(ALL)。 2. 继承表。 RecursiveUnion 处理WITH子句中递归定义的UNION子查询 WITH RECURSIVE … SELECT … 语句。 BitmapAnd Bitmap逻辑与操作 多维索引扫描的BitmapScan。 BitmapOr Bitmap逻辑或操作 多维索引扫描的BitmapScan。 Limit 处理LIMIT子句 OFFSET … LIMIT …
  • 物化算子 物化算子是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这是要用物化算子将元组缓存起来; 表3 物化算子 算子 含义 场景 Material 物化 缓存子节点结果。 Sort 排序 ORDER BY子句,连接操作,分组操作,集合操作,配合Unique。 Group 分组操作 GROUP BY子句。 Agg 执行聚集函数 COUNT/SUM/AVG/MAX/MIN等聚集函数。 DISTINCT子句。 UNION去重。 GROUP BY子句。 WindowAgg 窗口函数 WINDOW子句。 Unique 去重(下层已排序) DISTINCT子句。 UNION去重。 Hash HashJoin辅助节点 构造hash表,配合HashJoin。 SetOp 处理集合操作 INTERSECT/INTERSECT ALL,EXCEPT/EXCEPT ALL LockRows 处理行级锁 SELECT … FOR SHARE/UPDATE
  • 连接算子 连接算子对应了关系代数中的连接操作,以表 t1 join t2 为例,主要的集中连接类型如下:inner join、left join、right join、full join、semi join、 anti join,其实现方式包括Nestloop、HashJoin及MergeJoin。 表2 连接算子 算子 含义 场景 实现特点 NestLoop 嵌套循环连接,暴力连接,对每一行都扫描内表。 Inner Join, Left Outer Join, Semi Join, Anti Join 适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。 MergeJoin 归并连接(输入有序),内外表排序,定位首尾两端,一次性连接元组。等值连接。 Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join 也称作“融合连接”,是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。 因为Merge join需要做更多的排序,所以消耗的资源更多,因此通常情况下执行性能差于Hash Join。 如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时Merge Join的性能优于Hash Join。 (Sonic) HashJoin 哈希连接,内外表使用join列的hash值建立hash表,相同值的必在同一个hash桶。等值连接的连接两端必须为类型相同的等值连接,且支持hash散列。 Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join 哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。
  • 扫描算子 扫描算子用来扫描表中的数据,每次获取一条元组作为上层节点的输入, 存在于查询计划树的叶子节点,它不仅可以扫描表,还可以扫描函数的结果集、链表结构、子查询结果集。常见的扫描算子如下表所示: 表1 扫描算子 算子 含义 场景 SeqScan 顺序扫描 最基本的扫描算子,用于扫描物理表(没有索引辅助的顺序扫描)。 IndexScan 索引扫描 选择条件涉及的属性上建立了索引。 IndexOnlyScan 直接从索引返回元组 索引列完全覆盖结果集列。 BitmapScan(BitmapIndexScan, BitmapHeapScan) 利用Bitmap获取元组 BitmapIndexScan利用属性上的索引进行扫描,返回结果为一个位图;BitmapHeapScan从BitmapIndexScan输出的位图中获取元组。 TidScan 通过元组tid获取元组 WHERE conditions(like CTID = tid or CTID IN (tid1, tid2, …)) ; UPDATE/DELETE … WHERE CURRENT OF cursor; SubqueryScan 子查询扫描 以另一个查询计划树(子计划)为扫描对象进行元组的扫描。 FunctionScan 函数扫描 FROM function_name ValuesScan 扫描values链表 对VALUES子句给出的元组集合进行扫描。 ForeignScan 外部表扫描 查询外部表。 CteScan CTE表扫描 扫描SELECT查询中用WITH子句定义的子查询。
  • 更多优化示例 示例1:修改基表为REPLICATION表,并且在过滤列上创建索引。 1 2 3 create table master_table (a int); create table sub_table(a int, b int); select a from master_table group by a having a in (select a from sub_table); 上述事例中存在一个相关性子查询,为了提升查询的性能,可以将sub_table修改为一个REPLICATION表,并且在字段a上创建一个index。
  • 更多优化示例 示例1:修改基表为replication表,并且在过滤列上创建索引。 1 2 3 create table master_table (a int); create table sub_table(a int, b int); select a from master_table group by a having a in (select a from sub_table); 上述事例中存在一个相关性子查询,为了提升查询的性能,建表时,可以将sub_table修改为一个replication表,并且在字段a上创建一个index。
  • 告警场景 目前支持对以下7种导致性能问题的场景上报告警。 单列统计信息未收集 如果存在单列统计信息未收集,则上报相关告警。调优方法可以参考更新统计信息和统计信息调优。 告警信息示例: 整表的统计信息未收集: Statistic Not Collect: schema_test.t1 单列统计信息未收集: Statistic Not Collect: schema_test.t2(c1,c2) SQL不下推 对于不下推的SQL,尽可能详细上报导致不下推的原因。调优方法可以参考案例语句下推调优。 对于函数导致的不下推,告警导致不下推的函数名信息; 对于不支持下推的语法,会告警对应语法不支持下推,例如:含有With Recursive,Distinct On,row表达式,返回值为record类型的,会告警相应语法不支持下推等等。 告警信息示例: SQL is not plan-shipping, reason : "With Recursive" can not be shipped" SQL is not plan-shipping, reason : "Function now() can not be shipped" SQL is not plan-shipping, reason : "Function string_agg() can not be shipped" HashJoin中大表做内表 如果在表连接过程中使用了Hashjoin,且连接的内表行数是外表行数的10倍或以上;同时内表在每个DN上的平均行数大于10万行,且发生了下盘,则上报相关告警。调优方法可以参考使用plan hint调优执行计划。 告警信息示例: PlanNode[7] Large Table is INNER in HashJoin “Hash Aggregate” 大表等值连接使用Nestloop 如果在表连接过程中使用了nestloop,并且两个表中较大表的行数平均每个DN上的行数大于10万行、表的连接中存在等值连接,则上报相关告警。调优方法可以参考使用plan hint调优执行计划。 告警信息示例: PlanNode[5] Large Table with Equal-Condition use Nestloop"Nested Loop" 大表Broadcast 如果在Broadcast算子中,平均每DN的行数大于10万行,则告警大表broadcast。调优方法可以参考使用plan hint调优执行计划。 告警信息示例: PlanNode[5] Large Table in Broadcast "Streaming(type: BROADCAST dop: 1/2)" 数据倾斜 某表在各DN上的分布,存在某DN上的行数是另一DN上行数的10倍或以上,且有DN中的行数大于10万行,则上报相关告警。调优方法可以参考案例选择合适的分布列和数据倾斜调优。 告警信息示例: PlanNode[6] DataSkew:"Seq Scan", min_dn_tuples:0, max_dn_tuples:524288 估算不准 如果优化器的估算行数比实际行数大于10万行,并且估算行数和实际行数中较大值是较小值的10倍或以上,则上报相关告警。调优方法可以参考使用plan hint调优执行计划。 告警信息示例: PlanNode[5] Inaccurate Estimation-Rows: "Hash Join" A-Rows:0, E-Rows:52488
  • 规格约束 告警字符串长度上限为2048。如果告警信息超过这个长度(例如存在大量未收集统计信息的超长表名,列名等信息)则不告警,只上报warning: WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped" 如果query存在limit节点(即查询语句中包含limit),则不会上报limit节点以下的Operator级别的告警。 对于“数据倾斜”和“估算不准”两种类型告警,在某一个plan树结构下,只上报下层节点的告警,上层节点不再重复告警。这主要是因为这两种类型的告警可能是因为底层触发上层的。例如,如果在scan节点已经存在数据倾斜,那么在上层的hashagg等其他算子很可能也出现数据倾斜。
  • 优化前 将a作为t1和t2的分布列,表定义如下: 1 2 CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a); CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a); 执行如下查询: 1 SELECT * FROM t1, t2 WHERE t1.a = t2.b; 则执行计划存在“Streaming(type: REDISTRIBUTE)”,即DN根据选定的列把数据重分布到所有的DN,这将导致DN之间存在较大通信数据量,如图1所示。 图1 选择合适的分布列案例(一)
  • 优化后 将查询中的关联条件作为分布键,执行下列语句修改b作为t2的分布列: 1 ALTER TABLE t2 DISTRIBUTE BY HASH (b); 将表t2的分布列改为b列之后,执行计划将不再包含“Streaming(type: REDISTRIBUTE)”,减少了DN之间存在的通信数据量的同时,执行时间也从8.7毫秒降低至2.7毫秒,从而提升查询性能,如图2所示。 图2 选择合适的分布列案例(二)
  • 规格约束 告警字符串长度上限为2048。如果告警信息超过这个长度(例如存在大量未收集统计信息的超长表名,列名等信息)则不告警,只上报warning: WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped" 如果query存在limit节点(即查询语句中包含limit),则不会上报limit节点以下的Operator级别的告警。 对于“数据倾斜”和“估算不准”两种类型告警,在某一个plan树结构下,只上报下层节点的告警,上层节点不再重复告警。这主要是因为这两种类型的告警可能是因为底层触发上层的。例如,如果在scan节点已经存在数据倾斜,那么在上层的hashagg等其他算子很可能也出现数据倾斜。
  • 物化算子 物化算子是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这是要用物化算子将元组缓存起来; 表3 物化算子 算子 含义 场景 Material 物化 缓存子节点结果。 Sort 排序 ORDER BY子句,连接操作,分组操作,集合操作,配合Unique。 Group 分组操作 GROUP BY子句。 Agg 执行聚集函数 COUNT/SUM/AVG/MAX/MIN等聚集函数。 DISTINCT子句。 UNION去重。 GROUP BY子句。 WindowAgg 窗口函数 WINDOW子句。 Unique 去重(下层已排序) DISTINCT子句。 UNION去重。 Hash HashJoin辅助节点 构造hash表,配合HashJoin。 SetOp 处理集合操作 INTERSECT/INTERSECT ALL,EXCEPT/EXCEPT ALL LockRows 处理行级锁 SELECT … FOR SHARE/UPDATE
  • 控制算子 控制算子是一类用于处理特殊情况的节点,用于实现特殊的执行流程。 表4 控制算子 算子 含义 场景 Result 直接进行计算 不包含表扫描。 INSERT语句中只有一个VALUES子句。 ModifyTable INSERT/UPDATE/DELETE上层节点 INSERT/UPDATE/DELETE Append 追加 UNION(ALL)。 继承表。 MergeAppend 追加(输入有序) UNION(ALL)。 继承表。 RecursiveUnion 处理WITH子句中递归定义的UNION子查询 WITH RECURSIVE … SELECT … 语句。 BitmapAnd Bitmap逻辑与操作 多维索引扫描的BitmapScan。 BitmapOr Bitmap逻辑或操作 多维索引扫描的BitmapScan。 Limit 处理LIMIT子句 OFFSET … LIMIT …
  • 其他算子 其他算子包括Stream算子,以及RemoteQuery等算子。Stream算子主要有三种类型:Gather stream、Broadcast stream及Redistribute stream。 Gather stream:每个源节点都将其数据发送给目标节点进行汇聚。 Broadcast stream:由一个源节点将其数据发给N个目标节点进行运算。 Redistribute stream:每个源节点将其数据根据连接条件计算Hash值,根据重新计算的Hash值进行分布,发给对应的目标节点。 表5 其他算子 算子 含义 场景 Stream 多节点数据交换 执行分布式查询计划,节点间存在数据交换。 Partition Iterator 分区迭代器 分区表扫描,迭代扫描每个分区。 RowToVec 行转列 行列混合场景。 DfsScan / DfsIndexScan HDFS表(索引)扫描 HDFS表扫描。