gpt4 book ai didi

sql - 如何有效地真空分析 Postgres 中的表

转载 作者:行者123 更新时间:2023-11-29 12:10:40 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

“Vacuum 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 是另一个守护程序,它在后台和 Vacuum 表中运行而不锁定它们。 Auto Vacuum 也运行 Auto Analyze,因此 auto vacuum 也会自动分析一个表。自动清理对表执行操作需要满足的条件默认设置为表大小更新/删除的 20%。

示例:

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

关于sql - 如何有效地真空分析 Postgres 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37261697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com