元数据bloat之后导致数据库性能变慢
➢ 解答
- 查看 catalog 表是否有 bloat 问题
SET gp_select_invisible TO false;
SELECT count() FROM pg_attribute; // n1
SET gp_select_invisible TO true;
SELECT count() FROM pg_attribute; // n2
设 r =.n2 / n1,如果 r < 4,认为没有 bloat;如果 4 <= r <= 10,认为是中等 bloat;如果 r > 10,认为是严重的 bloat。 - 解决 catalog 的 bloat 问题
VACUUM ANALYZE pg_attribute;
REINDEX TABLE pg_attribute; - 分析
OushuDB master 使用多版本机制来实现更新操作,所以会产生过时的版本。过时的版本会带来性能问题,需要针对每一个系统表运行 VACUUM 命令。
可以使用如下脚本来对一个数据库的所有元数据表做 VACUUM 和 REINDEX。如果用户已经定期做 VACUUM,REINDEX 则不需要,可以从下面脚本中注释掉。 REINDEX 只有在长期没有做 VACUUM 后需要。
#!/bin/bash
VACUUM_CMD="VACUUM ANALYZE"
REINDEX_CMD="REINDEX TABLE"
if [ $# != 1 ]; then
echo "USAGE: vacuum.sh database-name"
exit
fi
echo -e "\nBegin: vacuum and reindex database: " $1 "\n"
psql -d $1 -tc "select '$VACUUM_CMD' || ' pg_catalog.' || relname || ';' from pg_class a,pg_namespace b where a.relnamespace=b.oid and b.nspname= 'pg_catalog' and a.relkind='r'" | psql -a $1
psql -d $1 -tc "select '$REINDEX_CMD' || ' pg_catalog.' || relname || ';' from pg_class a,pg_namespace b where a.relnamespace=b.oid and b.nspname= 'pg_catalog' and a.relkind='r'" | psql -a $1
echo -e "\nNOTE: Please ignore the errors about some tables which cannot be reindexed.\n"