Как узнать, актуальна ли статистика таблицы Postgres?

В pgAdmin, когда статистика таблицы устарела, он запрашивает:

Выполнение VACUUM рекомендуется

Расчетное количество строк в схеме таблицы. таблица отклоняется значительно от фактического количества строк. Вам следует запустить ВАКУУМНЫЙ АНАЛИЗ на этой таблице.

Я тестировал это с помощью pgAdmin 3 и Postgres 8.4.4 с autovacuum = off. Приглашение появляется сразу же, когда я нажимаю на таблицу, которая была изменена.

Допустим, я создаю веб-систему на Java, как мне определить, устарела ли таблица, чтобы я мог показать подсказку, как в pgAdmin?

Из-за характера моего приложения, вот несколько правил, которым я должен следовать:

  1. Я хочу знать, актуальна ли статистика определенной таблицы в pg_stats и pg_statistic.

  2. Я могу ' t установить флаг автоочистки в postgresql.conf. (Другими словами, флаг автоочистки может быть включен или выключен. Я не могу его контролировать.Мне нужно знать, актуальна ли статистика, независимо от того, включен или выключен флаг автоочистки.)

  3. Я не могу запускать очистку / анализ каждый раз, чтобы обновлять ее.

  4. Когда пользователь выбирает таблицу, мне нужно показать подсказку, что таблица устарела, когда есть какие-либо обновления в этой таблице (такие как удаление, вставка и обновление), которые не отражаются в pg_stats и pg_statistic.

Кажется, что это невозможно путем анализа временных меток в pg_catalog.pg_stat_all_tables. Конечно, если таблица ранее не анализировалась, я могу проверить, есть ли у нее временная метка в last_analyze, чтобы узнать, актуальна ли таблица. Однако, используя этот метод, я не могу определить, актуальна ли таблица, когда уже есть метка времени. Другими словами, независимо от того, сколько строк я добавляю в таблицу, ее временная метка last_analyze в pg_stat_all_tables всегда предназначена для первого анализа (при условии, что флаг автоочистки отключен). Поэтому я могу только впервые показать подсказку «Выполнить ВАКУУМ рекомендуется».

Это также невозможно при сравнении отметки времени last_analyze с текущей отметкой времени. Таблица может не обновляться несколько дней. И может быть множество обновлений за один час.

Учитывая этот сценарий, как я всегда могу определить, актуальна ли статистика таблицы?

17
задан Benoit Esnard 21 July 2015 в 09:10
поделиться