我在一个Django项目中运行了一个Postgres 9.4.18数据库,托管在Heroku上。我注意到查询变得越来越慢,因此我对其中一个查询运行了"EXPLAIN ANALYZE",发现其中一个节点的行估计值比实际行数要高得多:
-> Seq Scan on listings_listing u1 (cost=0.00..1536692.01 rows=5030003 width=8) (actual time=0.811..11263.410 rows=173537 loops=1)
我随后在表上运行了"VACUUM FULL ANALYZE"命令,然后重新运行了查询的"EXPLAIN ANALYZE"命令,得到如下结果:
-> Seq Scan on listings_listing u1 (cost=0.00..23554.61 rows=173537 width=8) (actual time=0.001..33.884 rows=173537 loops=1)
执行时间现在快了100倍。
所以两个问题是:A)自动清理不应该防止这种情况吗?(如何检查是否启用?)B)如果没有执行清理,它是如何变成这样的?
--------------------------------- 更新
我在Heroku找到了这个命令,可以提供自动清理统计信息,以下是输出结果(不幸的是,我在手动清理后才运行它)。
heroku pg:vacuum_stats DATABASE_URL
schema | table | last_vacuum | last_autovacuum | rowcount | dead_rowcount | autovacuum_threshold | expect_autovacuum
--------+-----------------------------------------+-------------+------------------+----------------+----------------+----------------------+-------------------
public | listings_listing | | 2018-06-27 15:36 | 173,537 | 0 | 34,757 |
看起来的阈值应该早就使它运行了。
此外,这里是Heroku页面上有关清理设置的文档: https://devcenter.heroku.com/articles/managing-vacuum-on-heroku-postgres