我想在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
任何人都可以帮我吗?
提前致谢!
答案 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