如何在PostgreSQL 8.2(Greenplum)中找到死元组(碎片)?

时间:2017-01-10 08:58:43

标签: sql greenplum

我想在PostgreSQL 8.2中找到死元组和表的实时元组。我们刚刚开始使用基于PostgreSQL 8.2的Greenplum MPP数据库系统。

由于默认的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 个答案:

答案 0 :(得分: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而是使用&#34; Append Optimized&#34;或简称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