Greenplum优化

本文分享了在Greenplum数据库环境下进行SQL优化的具体实践,包括选择合适的Distribution Key、使用Create Table替代Insert Into、调整内存配置、避免创建索引、合并SQL等方法,显著提升了查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 尽量选择连接条件作为Distribution Key,如有个SQL:insert into tablec (auction_id,….) select * from tablea left join talbeb on tablea.selid=tablec.id;优化前耗时120秒,优化方式:将tablea的Distribution Key 改为selid,tableb的改为id,tablec的Distribution Key 改为auction_id,优化后耗时88秒,提升了32秒
  2. 采用Createtable代替Insert into, 数据库内有很多表都是全量更新的,因此可以用Createtable来代替Insert into,性能能够大幅提高,例如1)中的SQL,改成Create  table  tablec as (select * from tablea left jointableb on tablea.selid=tablec.id) distributed by(auction_id),优化后耗时为65秒,提升了13秒
  3. 用explain analyze查看SQL执行计划,然后优化,例如2)的SQL,执行 explain analyze 后,发现执行计划中要求得到310M的memory,而在postgresql.conf中的work_mem为250M,因此导致资源不足,优化方式:将work_mem改成350M后,执行gpstop –u,优化后耗时55秒,提升了10秒
  4. 尽量避免创建索引,一般来说,在Greenplum中索引对于多表的join是没有性能提升的,例如淘宝有一个SQL,增加索引耗时约37秒左右,去掉索引后耗时基本不变,优化方法:删除这类索引,可以提高数据加载的性能;
  5. 收集统计信息和执行Vacuum,定期收集统计信息,可以优化SQL执行路径;sytax:analyze talbe,数据加载后执行Vacuum,或者采用重创建表的方式来释放垃圾数据,可以提高SQL效率;
  6. SQL合并,目前的SQL是从Oracle迁移过来的,Oracle由于性能原因,多个表的join和嵌套子查询都是分为多个SQL来实现的,在Greenplum中,建议将这些SQL合并为一个SQL实现,可以减少IO,达到提高性能的目的;
  7. 尽量避免用exists和not in语法,可以改成join和left join方法实现,Distinct尽量采用Group by来实现;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值