- 尽量选择连接条件作为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秒
- 采用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秒
- 用explain analyze查看SQL执行计划,然后优化,例如2)的SQL,执行 explain analyze 后,发现执行计划中要求得到310M的memory,而在postgresql.conf中的work_mem为250M,因此导致资源不足,优化方式:将work_mem改成350M后,执行gpstop –u,优化后耗时55秒,提升了10秒
- 尽量避免创建索引,一般来说,在Greenplum中索引对于多表的join是没有性能提升的,例如淘宝有一个SQL,增加索引耗时约37秒左右,去掉索引后耗时基本不变,优化方法:删除这类索引,可以提高数据加载的性能;
- 收集统计信息和执行Vacuum,定期收集统计信息,可以优化SQL执行路径;sytax:analyze talbe,数据加载后执行Vacuum,或者采用重创建表的方式来释放垃圾数据,可以提高SQL效率;
- SQL合并,目前的SQL是从Oracle迁移过来的,Oracle由于性能原因,多个表的join和嵌套子查询都是分为多个SQL来实现的,在Greenplum中,建议将这些SQL合并为一个SQL实现,可以减少IO,达到提高性能的目的;
- 尽量避免用exists和not in语法,可以改成join和left join方法实现,Distinct尽量采用Group by来实现;
Greenplum优化
最新推荐文章于 2024-03-29 11:16:31 发布