-
总结 通常优化器总会选择最优的执行计划,但是众所周知代价估算,尤其是中间结果集的代价估算一般会有比较大的偏差,这种比较大的偏差就可能会导致agg的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan进行agg计算模型的干预。 一般来说,当agg汇聚的收敛度很小时,即结果集的个数在agg之后并没有明显变少时(经验上以5倍为临界点),选择redistribute+hashagg执行方式,否则选择hashagg+redistribute+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 选择合适的分布列案例(二)
-
优化后 将查询中的关联条件作为分布键,执行下列语句修改b作为t2的分布列: 1 ALTER TABLE t2 DISTRIBUTE BY HASH (b);
将表t2的分布列改为b列之后,执行计划将不再包含“Streaming(type: REDISTRIBUTE)”,减少了DN之间存在的通信数据量的同时,执行时间也从8.7毫秒降低至2.7毫秒,从而提升查询性能,如图2所示。 图2 选择合适的分布列案例(二)
-
优化前 将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 选择合适的分布列案例(一)