【标题】(请简要描述下实现的内容)
提升numeric sum(), avg(), stddev(), variance() 性能
【实现内容】:
修改sum(), avg(), stddev(), variance() 的实现
【根因分析】:
原有实现存在太多性能不足
【修改方案】:
合入PG commit 69c8fbac201652282e18b0e2e301d4ada991fbde
对于transition函数返回类型是numeric类型、或者是数组型numeric的聚集函数,原来会使用数组取保存transvalues,
并且存在大量packing和unpacking操作。
在本次修改中,使用一个NumericAggState来保存这些值,避免上述的开销
需要关注的点:
(1)原来有个默认规则:对于transfn的返回值类型,行存跟向量化执行引擎是一致的,但合入此次commit后,会出现不一致的情况,目前用了hardcode来修改,见文件vecwindowagg.cpp的改动
(2)由于pg的pg_aggregate表中有aggtransspace列而og中没有,本次改动需要用到此列,否则会导致代价计算错误而计划错误,目前也采用了hardcode来修改,见clauses.cpp的改动
【关联issue】:
#I536GT:算子性能优化dev
【开发自验报告】:
优化前:
输入图片说明
优化后:
输入图片说明
可以看到在tpch query中的agg阶段有明显提升,有30-40%的提升