繁体   English   中英

如何有效地对 Postgres 中的表进行真空分析

[英]How to efficiently vacuum analyze tables in Postgres

我在 postgres 上运行了一个巨大的查询,其中一个连接表总是进行顺序扫描。 列上的索引存在,而 postgres 没有使用它。 我进行了真空分析,然后 postgres 查询计划立即更改为进行索引扫描。

我的问题是进行真空分析的最有效方法是什么。 它锁定表吗? 如果是这样,您如何真空分析实时生产表?

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

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”命令。

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

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

“真空分析”是一项手动清理操作,通常每周或每月执行一次,具体取决于对数据库执行的更新/删除频率。 可以对特定表或整个数据库执行此操作。 这需要 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,因此 autovacuum 也会自动分析表格。 自动真空对表执行操作需要满足的条件默认设置为表大小的更新/删除的 20%。

例子:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM