如何在 Postgres 中高效真空分析表

问题描述 投票:0回答:3

我在 postgres 上运行了一个巨大的查询,并且其中一个连接表总是进行顺序扫描。约束列上有一个索引,但 postgres 没有使用它。我运行了一个

VACUUM ANALYZE
,然后 postgres 查询计划表明现在正在使用索引扫描。

我的问题是,运行

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

sql postgresql vacuum
3个回答
35
投票

“真空分析” 实际上执行 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 是另一个守护进程,它在后台和 Vacuum 表中运行,而不锁定它们。自动真空还可以运行自动分析,因此自动真空也会自动分析表。自动清理对表执行操作所需满足的条件默认设置为表大小的更新/删除的 20%。

示例:

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


14
投票

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

真空分析锁表吗?

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


0
投票
https://www.youtube.com/watch?v=kR6HZjMfseo

有一个可用于完全真空的实用程序,即“pg_repack”,您也可以考虑使用它。该实用程序执行完全真空并且不锁定表(最小)。

https://www.youtube.com/watch?v=vdCPDf3pHKo

有一个完整的真空和Postgres系列。

© www.soinside.com 2019 - 2024. All rights reserved.