union 执行方式
集群计划对 union 的固有的执行方式有以下三种方式:
1、直接下发:能在各个节点上执行 union 操作,结果不需要汇总直接返回客 户端 如:
select id4 from x1 union select id4 from x2;
x1 和 x2 是 hash 分布表,且两表的 id4 是 hash 分布列
select entry_id,id4 from x1 minus select entry_id,id2 from r1;
x1 是 hash 分布表,id4 是 x1 的 hash 分布列,r1 是复制表。
2、单节点执行:只需要在一个节点上执行返回结果 如:
select * from r1 union select * from r2;
r1 和 r2 是复制表
select entry_id from x1 where x1.id4=10 union select id2 from x2 where x2.id4=10;
x1 和 x2 是 hash 分布表,且两个表的分布列都是 id4.
3、先执行再汇总:各个节点先执行 union,结果汇总到一个节点上,再在汇总节点上执行 distinct。
union 优化原理:
该优化受参数控制,优化主要是增加了计算节点数目,在节点数较多时(10 个以上),性能提升明显。具体优化方式如下: 能够满足“直接下发”和“单节点执行”的,按“直接下发”和“单节点执 行”进行执行;对于不能满足的,通过拉表转换成“直接下发”或“单节点 执行”进行执行,优先转换成直接下发执行。拉表包括拉复制表和 hash 重分布拉表。
union 优化控制参数
- _t_gcluster_union_redist_optimize
控制是否开启 union 重分布优化.
取值范围[0,1,2]
默认值为 0 代表关闭
1 表示开启不支持 union 两边对应为 int 和 decimal 列进行重分布优化
2 表示开启,支持 union 两边对应为 int 和 decimal 列进行重分布优化,
重分布前会将 int 列转换为 decimal 类型,进行重分布
注: hash 重分布是指将表中的数据按照 union 操作时临时指定的列作为 hash 分布 列进行 hash 重分布。不同的数据类型有不同的 hash 算法,union 优化要求各 子句对应位置上的 hash 列数据类型要相同,如果不相同需转为一致的数据类 型。目前只支持 int->decimal 的数据类型转换,其他类型之间的转换均不支 持。
- _t_gcluster_union_redist_distinct
控制子查询拉表时是否带上 distinct。
取值范围[0,1] 默认值为 1,表示带 distinct
注: 对需要去重的情况,union 子查询拉表时,通常会在投影列中增加 distinct 关 键字先进行一次去重以减少拉表和下一步计算的数据量。当子查询数据重复率较低,进行一次 distinct 减少的数据量不大时,可以设置该参数为 0,减少 一次 distinct。