【发布时间】:2018-12-11 08:22:15
【问题描述】:
我在 Django 项目中的 Heroku 上运行了一个 Postgres 9.4.18 数据库。我注意到查询变得越来越慢,所以我对一个查询运行了“解释分析”,并注意到对于一个节点,行估计大大高于实际行数:
-> 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 中找到了这个给出 autovacuum 统计信息的命令,这是输出(不幸的是,我在手动清理之后运行了它。
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
【问题讨论】:
标签: django postgresql heroku