【问题标题】:how to automatically determine which tables need a vacuum / reindex in postgresql如何在postgresql中自动确定哪些表需要vacuum / reindex
【发布时间】:2010-11-02 18:09:39
【问题描述】:

我已经为我们的数据库编写了一个维护脚本,并且希望在我们每天停机期间在最需要清理/重新索引的任何表上运行该脚本。有什么方法可以在 postgres 中确定吗?

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

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

我看到了一些很有希望的东西here

【问题讨论】:

    标签: optimization postgresql indexing vacuum


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      但是,如果我确实理解了您的需求,我会这样做:

      • 为每个表(您有多少表?)定义标准;

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

      • 编写您自己的应用程序来执行此操作。

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 哈哈,感谢您的坦率,我们过去使用过自动吸尘器,但发现它碍事了。我宁愿它利用我们的停机时间,而不是在我们最忙的时候开始真空。除非这比我上次看它时更可配置。
        • 看起来这是很久以前的事了。你有没有想出解决办法?我还发现我们无法使用自动真空。
        • @samyi 还没有。我看到 auto-vacuum 仍然没有参数来避免一天中的繁忙时间。
        猜你喜欢
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 2017-02-05
        • 2021-09-08
        • 2020-02-09
        相关资源
        最近更新 更多