У меня есть база данных Postgres 9.4.18, запущенная на Heroku в проекте Django. Я заметил, что запросы становятся все более медленными, поэтому я запустил «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 раз быстрее.
Итак, два вопроса: а) не должна ли автоматическая очистка пылесоса предотвращать это? (как я могу проверить, включено ли это?) 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