В pgAdmin, когда статистика таблицы устарела, она выдает:
Рекомендуется использовать VACUUM
Расчетное количество строк в таблице schema.table отклоняется
значительно от фактического количества строк. Вы должны запустить VACUUM ANALYZE
на этом столе.
Я протестировал его, используя pgAdmin 3 и Postgres 8.4.4, с autovacuum = off. Подсказка появляется сразу же, когда я щелкаю таблицу, которая была изменена.
Допустим, я делаю веб-систему на Java, как я могу определить, устарела ли таблица, чтобы я мог показать подсказку, подобную той, что в pgAdmin?
Из-за характера моего приложения, вот несколько правил, которым я должен следовать:
Я хочу знать, актуальна ли статистика определенной таблицы в pg_stats и pg_statistic.
Я не могу установить флаг автоочистки в postgresql.conf. (Другими словами, флаг автоочистки может быть включен или выключен. Я не могу его контролировать. Мне нужно сообщить, актуальна ли статистика, включен ли флаг автоочистки.)
Я не могу запускать вакуум / анализировать каждый раз, чтобы обновлять его.
Когда пользователь выбирает таблицу, мне нужно показать подсказку, что таблица устарела, когда есть какие-либо обновления этой таблицы (такие как удаление, вставка и обновление), которые не отражены в pg_stats и pg_statistic .
Кажется, что это невозможно сделать, анализируя временные метки в pg_catalog.pg_stat_all_tables. Конечно, если таблица не была проанализирована ранее, я могу проверить, есть ли у нее отметка времени в last_analyze, чтобы выяснить, актуальна ли таблица. Однако, используя этот метод, я не могу определить, обновлена ли таблица, когда уже есть временная метка. Другими словами, независимо от того, сколько строк я добавляю в таблицу, его отметка времени last_analyze в pg_stat_all_tables всегда для первого анализа (при условии, что флаг autovacuum выключен). Таким образом, я могу только показать приглашение «Запуск VACUUM рекомендуется» только в первый раз.
Это также неосуществимо, сравнивая метку времени last_analyze с текущей меткой времени. Там может не быть никаких обновлений в таблице в течение нескольких дней. И в один час может быть множество обновлений.
Учитывая этот сценарий, как я всегда могу узнать, актуальна ли статистика таблицы?