我在postgres上运行了一个庞大的查询,其中一个连接表总是进行顺序扫描。约束列上有一个索引,postgres只是没有使用它。我运行了一个VACUUM ANALYZE,然后postgres查询计划表明现在正在使用索引扫描。
我的问题是,运行VACUUM ANALYZE最有效的方法是什么?它能锁桌子吗?如果是的话,如何在实时生产表上运行VACUUM ANALYZE?
发布于 2021-09-16 10:38:49
“真空分析”实际上执行两个完全不同的任务。
“真空分析”是一种手动清理操作,通常每周或每月进行一次,这取决于数据库上执行的更新/删除的频率。此操作可以在特定的表或整个数据库上执行。这需要30分钟到甚至几天的时间,这取决于数据库的大小和执行此操作的频率。
何时使用真空充盈与分析:
如果您的数据库占用了太多的空间,并且您的操作系统没有执行任何其他操作的空间,那么您需要进行真空填充,还建议向其添加分析选项。如果您有一个高写入频率的数据库,那么我建议您至少每3-6个月执行一次此操作。
VACUUM(FULL, ANALYZE, VERBOSE);如果您不能锁定整个数据库,并且只需要释放一个表占用的空间,该表就会进行大量的更新/删除。然后在特定的桌子上放满真空
VACUUM FULL VERBOSE your_table_name;如果您正面临一个问题,您的查询会随着时间的推移而变慢,也就是说,如果您在查询上运行EXPLAIN,有时它使用顺序扫描,而具有不同参数的相同查询则使用索引扫描。这意味着您的表没有被完全分析。分析可以在整个数据库或特定的表上执行。在此操作期间,数据库或表不会被锁定,在此操作之后,您的查询将执行得更好。
ANALYZE VERBOSE your_table_name自动分析:
尽管您可能永远不需要手动分析数据库,因为这是由在后台运行的auto ANALYZE自动完成的,并分析超过某个更新/删除阈值(默认情况下是表大小的10% )的表。但是在大型表上,这个阈值从未达到,即使在5%的阈值下,查询也会变得缓慢。因此,分析应该在一定的间隔内与真空一起手动进行。
自动真空:
自动真空是另一个在后台和真空表中运行而不锁定它们的设备。自动真空也运行自动分析,因此自动真空也将自动分析表。自动真空对表执行操作所需满足的条件默认设置为表大小的更新/删除的20%。
示例:
一个包含4000万行的表,当表接收到800万次更新或删除时,自动真空将运行。类似地,为了启动自动分析,该表需要接收400万次更新或删除。大多数这样大小的表在收到此阈值之前会变慢,因此建议定期进行手动真空全面分析。
发布于 2016-05-16 21:05:38
你只能运行分析,不需要运行真空也。语法是:
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]在文件中指出:
分析只需要目标表上的读锁,因此它可以与表上的其他活动并行运行。
您可以在这里找到更多信息:
http://www.postgresql.org/docs/9.4/static/sql-analyze.html
真空分析锁表吗?
不,锁表的是“完全真空”命令。
https://stackoverflow.com/questions/37261697
复制相似问题