我在 postgres 上运行了一个巨大的查询,其中一个连接表总是进行顺序扫描。约束列上有一个索引,而 postgres 只是没有使用它。我运行了一个VACUUM ANALYZE
,然后 postgres 查询计划表明现在正在使用索引扫描。
我的问题是,运行 a 的最有效方法是VACUUM ANALYZE
什么?它会锁定表吗?如果是这样,您如何VACUUM ANALYZE
在实时生产表上运行?
我在 postgres 上运行了一个巨大的查询,其中一个连接表总是进行顺序扫描。约束列上有一个索引,而 postgres 只是没有使用它。我运行了一个VACUUM ANALYZE
,然后 postgres 查询计划表明现在正在使用索引扫描。
我的问题是,运行 a 的最有效方法是VACUUM ANALYZE
什么?它会锁定表吗?如果是这样,您如何VACUUM ANALYZE
在实时生产表上运行?
你可以只运行分析,也不需要运行真空。语法是:
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”命令。
“真空分析”实际上执行 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 是另一个在后台运行的守护进程,它在真空表中运行而不锁定它们。Auto Vacuum 也使用它运行 Auto Analyze,因此 auto Vacuum 也会自动分析表。自动清理对表执行操作所需满足的条件默认设置为表大小的 20% 的更新/删除。
例子:
一个有 4000 万行的表,当表接收到 800 万次更新或删除时,将运行自动清理。同样,该表需要接收 400 万次更新或删除才能启动自动分析。大多数这种大小的表在收到此阈值之前会变慢,因此建议定期手动进行 VACUUM FULL ANALYZE。