4

i've written a maintenance script for our database and would like to run that script on whichever tables most need vacuuming/reindexing during our down time each day. is there any way to determine that within postgres?

i would classify tables needing attention like this:

  • tables that need vacuuming
  • tables that need reindexing (we find this makes a huge difference to performance)

i see something roughly promising here

4

3 回答 3

4

听起来您正在尝试重新发明自动真空。你有什么理由不能启用它并让它完成它的工作?

有关您想要的实际信息,请查看pg_stat_all_tablespg_stat_all_indexes

有关如何使用其中数据的一个很好的例子,请查看 auto-vacuum 的来源。它不直接查询视图,但它使用该信息。

于 2009-06-25T09:29:26.463 回答
0

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

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

  • 对于每张桌子(你有多少张桌子?)定义标准;

例如, talbe 'foo' 需要每 X 条新记录重新索引,并且每 X 条更新、删除或插入都需要清理

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

每天它都会检查表状态,将其保存在日志中(以比较行在一段时间内的差异),然后重新索引/清空与您的条件匹配的表。

听起来有点骇人听闻,但我认为这是一个很好的方法custom-autovacuum-with-custom-'triggers'-criteria

于 2010-01-22T10:44:12.670 回答
0

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

该函数将接收表名,检查表的状态,然后对该表运行真空或重新索引。

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

此外,如果您的数据库机器足够强大,并且您的停机时间足够长,只需每晚运行一个脚本来重新索引它,然后将其全部清空......即使在测试时间(晚上)没有满足您的标准,但是接近它(很少有记录低于您的标准),它不会在第二天达到标准时造成问题......

于 2010-07-19T22:01:17.653 回答