Skip to content

Files

Latest commit

Dec 15, 2023
f400df2 · Dec 15, 2023

History

History
195 lines (72 loc) · 6.83 KB

20181112_01.md

File metadata and controls

195 lines (72 loc) · 6.83 KB

Greenplum 垃圾回收、收集统计信息调度 - vacuum analyze 所有表 - 注意锁问题

作者

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热门书籍等,奖品丰富,快来许愿。开不开森.

digoal's wechat