原文地址:HybridDB · 性能优化 · Count Distinct的几种实现方式
HybridDB是阿里基于GreenPlum开发的一款MPP分析性数据库,而GreenPlum本身基于PostgreSQL。
如此,HybridDB的优化思路和手段难免会受到PostgreSQL影响和限制。
文中的语句最终优化得到了几个不同计划,其优化的语句简化后形如
select count(distinct c1) from t group by c2;
这条语句在HybridDB下实现:
- 每个服务器自行分组、计算count(distinct);
- 将上一步结果按照分组列重新分发;
- 每个服务器根据收到的数据进行二次分组计算;
- 收集汇总到一个服务器得到最终结果。
文中优化点集中在分组的实现方式上,
a), 排序+分组;
b), hash分组;
c), orca优化方式,同a#,改进在于第一次排序项不同。
原文中a#, b#, c#的计划概括
a),
Scan (Columnar Scan + Append) -> Sort(category) -> Group by(category) -> Redistribute -> Sort(category) -> Group by(category) -> Sort -> Gather
b),
Scan (Columnar Scan + Append) -> Group by(Hash(category,actionId)) -> Redistribute(category) -> Group by(Hash(category, acitonId)) -> Group by(Hash(category)) -> Sort -> Gather
c),
Scan (Dynamic Scan) -> Sort (category, actionId) -> Group by (category) -> Redistribute -> Sort (category) -> Group by(category) -> Sort -> Gather
个人认为这篇文章提到的优化和MPP关系不大,单机下也许也能得到类似的不同计划。
也许是受限于数据分布特性、数据量等因素,MPP下数据分发、汇总的MOTION优化并没有体现在这里。