2017-01-10 89 views
0

我想在PostgreSQL 8.2中找到死元组和表的活元组。我们刚刚开始使用基于PostgreSQL 8.2的Greenplum MPP数据库系统。如何在PostgreSQL 8.2(for Greenplum)中找到死元组(碎片)?

由于默认的MVCC体系结构,我们需要找到一个表的死元组,并制定计划将其变为VACUUM。

我知道,如何在新版本的PostgreSQL中找到死元组。我已经分享了两篇文章。

PostgreSQL: How to check Table Fragmentation using pgstattuple module

PostgreSQL: Script to find total Live Tuples and Dead Tuples (Row) of a Table

任何一个可以帮助我在这?

在此先感谢!

+1

如果它是基于PostgreSQL的8.2,它应该有自动清理。使用它,而不是试图自己弄清楚。 –

+0

感谢您的回复,是autovacuum在那里,但我有很多表,每个大小约150GB。所以我也需要手动活动。 – Anvesh

+0

为什么?你不能配置autovacuum,以便它能满足你的需求吗? –

回答

3

请勿使用autovacuum。 Greenplum不是PostgreSQL,并且autovacuum在数据库中不起作用。我强烈建议不要使用PostgreSQL标记Greenplum帖子,因为您可能会得到不正确的信息。这就像发布一个关于OSX的问题,并且标记BSD。

真空堆表与膨胀:

psql -t -A -c "SELECT E'VACUUM \"' || bdinspname || E'\".\"' || bdirelname || E'\";' FROM gp_toolkit.gp_bloat_diag WHERE bdinspname <> 'pg_catalog'" | psql -e 

但大多数都在您的Greenplum表的可能不会是堆它采用MVCC,而使用“附加优化”或AO的简称。它使用可见性映射来隐藏已删除的行,并且文件更小,因此速度更快。它也允许表格被压缩和列向导。

AO表还需要维护,但与堆表不同,它具有由gp_appendonly_compaction_threshold GUC控制的压缩阈值。只要VACUUM所有AO表和数据库将自动重建表,如果隐藏行的百分比超过10%。

Greenplum仍然遭受从PostgreSQL继承的冻结年龄问题。这个脚本通常不会返回任何行,而是在较长时间没有被触摸的表格的较早安装中,您可能会开始抽真空表格。

vacuum_freeze_min_age=$(psql -t -A -c "show vacuum_freeze_min_age;") 
psql -t -A -c "SELECT E'VACUUM \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c join pg_namespace n ON c.relnamespace = n.oid WHERE age(relfrozenxid) > $vacuum_freeze_min_age AND c.relkind = 'r'" | psql -e 

当你在它的时候,你应该安排analyzeb来定期分析所有的表。例如:

analyzedb -d gpadmin -s tpcds 

别忘了目录!

psql -t -A -c "SELECT E'VACUUM ANALYZE \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = 'pg_catalog' AND c.relkind = 'r'" | psql -e 

这重新索引目录索引:

reindexdb -s 
+2

问题发布后,我删除了Postgres标签,但Anvesh添加了它,我不想开始编辑战争 –

+0

感谢Jon,将检查此解决方案并回复给您。也删除了postgresql标签。 – Anvesh