如何在postgresql中自动确定哪些表需要vacuum / reindex

时间:2009-06-13 21:37:42

标签: optimization postgresql indexing vacuum

我为我们的数据库编写了一个维护脚本,并希望在我们每天停机期间最需要吸尘/重新索引的表格上运行该脚本。有没有办法在postgres中确定?

我会像这样对需要注意的表进行分类:

  • 需要吸尘的表格
  • 需要重新索引的表格(我们发现这对性能产生巨大影响)

我看到一些大概有希望的here

3 个答案:

答案 0 :(得分:4)

听起来你正试图重新发明自动吸尘器。有什么理由你不能只是启用它并让它做它的工作吗?

要获得所需的实际信息,请查看 pg_stat_all_tables pg_stat_all_indexes

有关如何使用其中数据的一个很好的示例,请查看自动真空的来源。它不直接查询视图,但它使用该信息。

答案 1 :(得分:0)

我认为你真的应该考虑自动吸尘。

但是,如果我确实理解了您的需求,那就是我要做的:

  • 对于每个表(你有多少个表?)定义标准;

例如,talbe'foo'需要重新索引每个X新记录并清空每次X更新,删除或插入

  • 写出你自己的应用程序来做到这一点。

每天检查表状态,将其保存在日志中(以比较时间上的行差异),然后重新索引/清空符合您标准的表。

听起来有点黑客,但我认为这是做custom-autovacuum-with-custom-'triggers'-criteria

的好方法

答案 2 :(得分:0)

如何将对任何CRUD操作后运行的相同触发器函数添加到所有表中。

该函数将接收表名,检查表的状态,然后在该表上运行vacuum或reindex。

应该是一个“简单的”pl / sql触发器,但那些从来都不简单......

另外,如果您的数据库机器足够强大,并且您的停机时间足够长,那么每晚只需运行一个脚本来重新编制所有内容,并将所有内容真空吸尘......即使您的标准在测试时未达到要求也是如此(晚上)但接近它(几乎没有你的标准记录),第二天它达到标准时不会出现问题...