我在Postgres上运行一个巨大的查询,其中一个联接表总是进行顺序扫描。约束列上有索引,但Postgres没有使用它。我运行了VACUUM ANALYZE
,现在Postgres查询计划指示正在使用索引扫描。
我的问题是,运行VACUUM ANALYZE
的最有效方式是什么?它是否锁定了表?如果是的话,如何在生产环境中运行VACUUM ANALYZE
?
我在Postgres上运行一个巨大的查询,其中一个联接表总是进行顺序扫描。约束列上有索引,但Postgres没有使用它。我运行了VACUUM ANALYZE
,现在Postgres查询计划指示正在使用索引扫描。
我的问题是,运行VACUUM ANALYZE
的最有效方式是什么?它是否锁定了表?如果是的话,如何在生产环境中运行VACUUM ANALYZE
?
何时使用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。
自动清理:
自动清理是另一个在后台运行的守护程序,可以在不锁定表格的情况下对其进行清理。自动清理还会自动运行自动分析,因此自动清理还会自动分析表格。默认情况下,自动清理对于表格的更新/删除量必须达到表大小的20%才能执行操作。
示例:
假设有一张有4,000万行数据的表格,当表格接收到8,000,000次更新或删除时,自动清理将会运行。同样,该表格需要接收4,000,000次更新或删除才能启动自动分析。通常,在达到这个阈值之前,这样大小的表格会变得缓慢,因此建议定期手动执行VACUUM FULL ANALYZE。
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
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”命令会锁定表格。