【问题标题】:How to efficiently vacuum analyze tables in Postgres如何在 Postgres 中高效地对表进行真空分析
【发布时间】:2016-05-16 19:24:31
【问题描述】:

我在 postgres 上运行了一个巨大的查询,其中一个连接表总是进行顺序扫描。约束列上有一个索引,而 postgres 只是没有使用它。我运行了VACUUM ANALYZE,然后 postgres 查询计划表明现在正在使用索引扫描。

我的问题是,运行VACUUM ANALYZE 的最有效方法是什么?它会锁定表吗?如果是这样,您如何在实时生产表上运行VACUUM ANALYZE

【问题讨论】:

  • and one of the join tables always did a sequential scan. The index on the column exists and postgres just didn't use it. 这与 VACUUM 无关。
  • 也许是无关的。但在我进行真空分析后,计划发生了变化。如果您能提出一个更有意义的答案,而不是说出与它无关的内容,那将会更有帮助。
  • 是的,VACUUM ANALYZE 会更新统计信息,这可能会导致选择另一个计划。通常,这仅在表发生更改时才重要(例如,通过添加索引或将新数据导入新表)(对不起:我忽略了分析部分)

标签: sql postgresql vacuum


【解决方案1】:

您可以只运行分析,也不需要运行真空。 语法是:

ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]

在文档中指出:

ANALYZE 只需要目标表上的读锁,因此它可以与表上的其他活动并行运行。

您可以在此处找到更多信息:

http://www.postgresql.org/docs/9.4/static/sql-analyze.html

https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT

vacuum 是否分析锁表?

不,锁定表的是“FULL VACUUM”命令。

【讨论】:

    【解决方案2】:

    “真空分析”实际上执行了 2 个完全不同的任务。

    1. 真空用于释放死元组/行占用的空间。
    2. Analyze 用于分析表的内容,进而帮助规划器创建更好的查询计划。

    “真空分析” 是手动清理操作,通常每周或每月执行一次,具体取决于对数据库执行更新/删除的频率。可以对特定表或整个数据库执行此操作。这需要 30 分钟甚至几天不等,具体取决于数据库的大小以及执行此操作的频率。

    何时使用 VACUUM FULL 和 ANALYZE:

    如果您的数据库占用了太多空间并且您的操作系统没有剩余空间来执行任何其他操作,那么您需要执行 VACUUM FULL,还建议为其添加 ANALYZE 选项。 如果您有一个高写入频率的数据库,那么我建议至少每 3-6 个月执行一次此操作。

    VACUUM(FULL, ANALYZE, VERBOSE);
    

    如果你不能锁定整个数据库,你只需要释放一个表占用的空间,该表会进行大量更新/删除。然后在特定表上使用 VACUUM FULL

    VACUUM FULL VERBOSE your_table_name;
    

    如果您遇到问题,您的查询会随着时间的推移而变慢,即如果您在查询上运行 EXPLAIN 并且有时它使用顺序扫描,而具有不同参数的相同查询使用索引扫描。那么这意味着你的表没有被完全分析。可以对整个数据库或特定表执行分析。在此操作期间数据库或表不会被锁定,您的查询将在此操作后执行得更好。

    ANALYZE VERBOSE your_table_name
    

    自动分析:

    虽然您可能永远不需要手动分析数据库,因为这是由自动分析守护程序自动完成的,该守护程序在后台运行并分析超过特定更新/删除阈值的表,默认情况下为表的 10%尺寸。但是在大型表上,这个阈值永远不会满足,即使在 5% 的阈值上,查询也会变得很慢。因此,ANALYZE 应与 VACUUM FULL 定期手动执行。

    自动吸尘器:

    Auto Vacuum 是另一个在后台运行的守护程序,并且不锁定表真空表。 Auto Vacuum 也使用它运行 Auto Analyze,因此 auto Vacuum 也会自动分析表。自动清理对表执行操作所需满足的条件默认设置为表大小的 20% 的更新/删除。

    示例:

    一个有 4000 万行的表,自动清理将在表接收到 800 万次更新或删除时运行。同样,该表需要接收 400 万次更新或删除才能启动自动分析。大多数这种大小的表在收到此阈值之前会变慢,因此建议定期手动进行 VACUUM FULL ANALYZE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-08-24
      • 2017-01-14
      相关资源
      最近更新 更多