digoal
2018-11-12
PostgreSQL , Greenplum , 垃圾回收 , 统计信息 , 调度
greenplum 老的版本并不支持自动垃圾回收,如果经常需要update,delete,或者经常需要用到临时表,会导致数据表膨胀或元数据膨胀(pg_class, pg_attribute等元数据。因为目前没有全局临时表。)。
同时GREENPLUM的统计信息回收也不像postgresql那么的智能。
当然,由于GPDB主要面向的是AP环境,AP的数据变化相对来说是比较低频的,所以建议用户自己调度垃圾回收、统计信息收集。
1、垃圾回收
《Greenplum 列存表(AO表)的膨胀、垃圾检查与空间收缩(含修改分布键)》
《如何检测、清理Greenplum膨胀、垃圾(含修改分布键) - 阿里云HybridDB for PG最佳实践》
2、统计信息
《Greenplum 统计信息收集参数 - 暨统计信息不准引入的broadcast motion一例》
需要注意,如果你为了偷懒,直接连到数据库执行
vacuum analyze;
这个会对全库的所有对象执行垃圾回收,以及收集统计信息,这个操作很容易触发锁冲突。
类似的例子还有数据库的逻辑备份,全局一致性逻辑备份,需要对元数据加锁,所以如果你的系统有建表、修改结构等DDL操作,在全局逻辑备份的过程中,可能冲突:
《PostgreSQL 最佳实践 - 在线逻辑备份与恢复介绍》
这种情况的解决办法,使用表级备份、垃圾回收。
全库,表级的垃圾回收例子
export PGHOST=
export PGPORT=
export PGUSER=
export PGPASSWORD=
export PGDATABASE=
假设需要对dbname_digoal数据库进行操作:
1、统计信息
echo "select 'analyze \"'||nspname||'\".\"'||relname||'\";' from pg_class t1 join pg_namespace t2 on (t1.relnamespace=t2.oid and t1.relkind='r') where t1.relowner in (select oid from pg_authid where not rolsuper);" | psql -q -t -f - dbname_digoal|psql -f - dbname_digoal
2、垃圾回收
echo "select 'vacuum \"'||nspname||'\".\"'||relname||'\";' from pg_class t1 join pg_namespace t2 on (t1.relnamespace=t2.oid and t1.relkind='r') where t1.relowner in (select oid from pg_authid where not rolsuper);" | psql -q -t -f - dbname_digoal|psql -f - dbname_digoal
3、垃圾回收、统计信息
echo "select 'vacuum analyze \"'||nspname||'\".\"'||relname||'\";' from pg_class t1 join pg_namespace t2 on (t1.relnamespace=t2.oid and t1.relkind='r') where t1.relowner in (select oid from pg_authid where not rolsuper);" | psql -q -t -f - dbname_digoal|psql -f - dbname_digoal
4、垃圾回收、冻结、统计信息
echo "select 'vacuum FREEZE analyze \"'||nspname||'\".\"'||relname||'\";' from pg_class t1 join pg_namespace t2 on (t1.relnamespace=t2.oid and t1.relkind='r') where t1.relowner in (select oid from pg_authid where not rolsuper);" | psql -q -t -f - dbname_digoal|psql -f - dbname_digoal
5、垃圾回收(强行FULL、DDL)、冻结、统计信息
通常在数据库膨胀后使用,不需要对所有表操作,只需要对膨胀很厉害的表操作。
echo "select 'vacuum full freeze analyze \"'||nspname||'\".\"'||relname||'\";' from pg_class t1 join pg_namespace t2 on (t1.relnamespace=t2.oid and t1.relkind='r') where t1.relowner in (select oid from pg_authid where not rolsuper);" | psql -q -t -f - dbname_digoal|psql -f - dbname_digoal
6、使用比较多的是垃圾回收+统计信息
《PostgreSQL 最佳实践 - 在线逻辑备份与恢复介绍》
《Greenplum 统计信息收集参数 - 暨统计信息不准引入的broadcast motion一例》
《PostgreSQL pg_stat_ pg_statio_ 统计信息(scan,read,fetch,hit)源码解读》
《Greenplum 列存表(AO表)的膨胀、垃圾检查与空间收缩(含修改分布键)》
《如何检测、清理Greenplum膨胀、垃圾(含修改分布键) - 阿里云HybridDB for PG最佳实践》
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.