postgresql分组聚合查询性能优化

利用项目空闲期对在做项目进行性能排查、优化。项目数据库采用postgresql。发现一个4万行数据的表进行简单的分组聚合查询花了2秒半左右时间。以下记录自己的优化过程。

查询sql举例:select count(distinct t1.a),t1.b from t1 group by t1.b

  1. 索引排查:数据库查询性能最直接的影响当然就是索引,但这里没有where条件过滤,group by字段又不能利用索引。
  2. 数据库服务端配置优化,具体可以查询相关文档,主要有shared_buffers work_mem等配置参数会影响查询性能。调优后发现耗时有减少,但任然在2秒左右。

  3. 并行查询:开启并行查询,发现执行计划任然走的是常规顺序扫描方式。强制开启并行模式,发现查询耗时反而增加了。怀疑数据量过少,不能利用并行查询的优势。并行查询需要创建额外进程,并且进程间还需要协调操作,不难想象耗时为什么会增加。

  4. 聚合方式:查看执行计划,发行采用的是GroupAggregate 聚合方式。搜索相关文章发现还有另外一种聚合方式HashAggregate并且小数据量性能更好,其中一篇文章详细介绍了两种方式的原理和优缺点。并且正好提到了count(distinct t1.a)这种方式数据库不能走HashAggregate,以及如何绕过的方式。修改sql为:select count(tmp.a),tmp.b  from (select t1.a as a,t1.b as b from t1 group by t1.b,t1.a) tmp gruop by tmp.b 耗时下降到600毫秒左右,还是比较明显的。附文章地址:https://www.slideshare.net/AlexeyBashtanov/pgday-uk-2016-performace-for-queries-with-grouping?from_action=save ,我也下载了一份,需要可以直接下载,https://download.csdn.net/download/guangmingguangming/12277562

  5. 如果要进一步提升性能估摸着只能做提前统计。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值