我有一个备份程序,它将生产数据库复制到我们的临时服务器上。它运行正常,但在我从其中一个快照恢复后,临时数据库变得慢得令人无法忍受。慢到我的网络服务器超时并出现 502 错误。
我仔细检查了导致这种情况的原因,并将其隔离到两个大表中。我们有一个特定的会话表,其中包含几个大型文本字段。我们正在存储一些非结构化数据,目前将其保存在文本字段中。一旦我缩减该表(通过删除许多行),暂存环境就会加速并再次开始正常运行。
我已经完成了对数据库进行 pg_reindexing 的例行操作,并尝试了 VACUUMing,但效果并不明显。速度仍然很慢。不需要访问两个大表的页面运行正常;需要访问的页面则无法加载。
简而言之,我想寻求帮助来回答两个问题。
如果我的数据库转储大于 130 MB,是否有更好的方法将数据库从生产复制到暂存,而不会导致此问题?我印象中 130MB 不是一个很大的数据库。我怀疑这一切都在带有我之前提到的 TEXT 字段的大型会话表中。
有什么方法可以优化此表?在 pg_restoring 之后我可以进行任何调整吗?我担心在下雨天我不得不从其中一个备份中恢复,而这会影响整个网站的性能。
提前致谢。
答案1
当你用吸尘器吸尘时,你在进行分析吗?
重新索引不应该有帮助:当你 pg_restore 时,所有这些索引都是从头开始创建的。
VACUUM 本身不会做任何事情:新恢复的数据库不包含任何需要清除的死元组。
恢复后,在整个数据库上运行 ANALYZE,这会更新统计信息,从而允许查询优化器生成有效的查询计划。