我有一个包含 100 多个表的大型数据库。其中一些表太大,以至于对它们运行 VACUUM 需要几个小时,所以我不想在这些表上运行它。有没有办法使用动态表列表运行 VACUUM,即如下所示?
VACUUM (SELECT table_name FROM information_schema.tables WHERE table_name not in ['list', 'of', 'big', 'tables'])
当然,可以手动列出所有表名,但理想情况下,我希望有一种动态地完成此操作的方法。
答案1
...表太大了,在它们上运行 VACUUM 需要几个小时,所以我不想在这些表上运行它。
这实际上可能是适得其反。
你说 VACUUM 需要几个小时,但实际上做什么?有吗?消除表中的任何元组?
如果对该表进行了大量事务更新,那么“死”行有需要一段时间才能清除(通过 VACUUM 清除)。如果不这样做,那么应用程序的性能将开始快速下降,因为 PostgreSQL 必须处理不断增加的死行数量。
你正在运行哪个版本的 PostgreSQL?你可能会发现它正在自动为你执行 VACUUM。
如果你仍然想要这样做,然后编写一个查询来“选择” VACUUM 语句,将它们假脱机到文件中并以 SQL 形式运行该文件:
select 'vacuum ' || table_name || ';' ddl
from information_schema.tables
where ...