Vertica的这些事<十>—— vertica中group by 和join 语句的优化

    xiaoxiao2025-10-19  8

    vertica group by优化语句,先对语句进行explain 操作查看预执行计划,其中group by 分为 GROUPBY PIPELINED 和 GROUPBY HASH,通过执行计划可以清楚的看到vertica到底采用的那种执行方式,优化一般就是吧GROUPBY HASH优化为GROUPBY PIPELINED 下面讲一下官网举得例子

    CREATE TABLE sortopt ( a INT NOT NULL, b INT NOT NULL, c INT, d INT ); CREATE PROJECTION sortopt_p ( a_proj, b_proj, c_proj, d_proj ) AS SELECT * FROM sortopt ORDER BY a,b,c UNSEGMENTED ALL NODES; INSERT INTO sortopt VALUES(5,2,13,84); INSERT INTO sortopt VALUES(14,22,8,115); INSERT INTO sortopt VALUES(79,9,401,33); 第一种情况GROUP BY a GROUP BY a,b GROUP BY b,a GROUP BY a,b,c GROUP BY c,a,b 如果是按照上面的这种group by 则使用的是GROUPBY PIPELINED,因为group by 后的字段全部在projection中预排序GROUP BY a,b,c,d

    这种情况则是采用的GROUPBY HASH 不建议~

    第二种情况 GROUP BY a,c 执行 按照GROUPBY HASH 因为a,c字段没有相邻,如果是 GROUP BY a,c或者GROUP BY b,c则会按照GROUPBY PIPELINED 执行

    第三种情况

    group by 之前有 where条件时

    SELECT a FROM tab WHERE a = 10 GROUP BY b 此时按照 GROUPBY PIPELINED

    SELECT a FROM tab WHERE a = 10 GROUP BY c 此时按照 GROUPBY HASH 以为按照c排序的 处理的所有的 Projectionn 列的列未出现在 where 子句等值条件中,如果上如改为SELECT a FROM tab WHERE a = 10 and b=10 GROUP BY c 则会按照GROUPBY PIPELINED 执行

    通过以上3中情况的介绍,希望大家对vertica的group by有一定的理解。

    **> 关于join vertica会有两种执行方式 Merge Join 和Hash join ,建议关联是要走Merge join

    执行Merge join的必要条件就是 关联的字段要在两个表中预排序,也就是要是两个表的order by 字段**

    可以参考官网Avoiding GROUP BY HASH with Projection Design

    最新回复(0)