Как узнать, актуальна ли статистика таблицы Postgres? - PullRequest
15 голосов
/ 02 августа 2011

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

Рекомендуется использовать VACUUM

Расчетное количество строк в таблице schema.table отклоняется значительно от фактического количества строк. Вы должны запустить VACUUM ANALYZE на этом столе.

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

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

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

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

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

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

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

Кажется, что это невозможно сделать, анализируя временные метки в pg_catalog.pg_stat_all_tables. Конечно, если таблица не была проанализирована ранее, я могу проверить, есть ли у нее отметка времени в last_analyze, чтобы выяснить, актуальна ли таблица. Однако, используя этот метод, я не могу определить, обновлена ​​ли таблица, когда уже есть временная метка. Другими словами, независимо от того, сколько строк я добавляю в таблицу, его отметка времени last_analyze в pg_stat_all_tables всегда для первого анализа (при условии, что флаг autovacuum выключен). Таким образом, я могу только показать приглашение «Запуск VACUUM рекомендуется» только в первый раз.

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

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

Ответы [ 2 ]

20 голосов
/ 02 августа 2011

Проверьте системные каталоги.

test=# SELECT schemaname, relname, last_analyze FROM pg_stat_all_tables WHERE relname = 'city';
 schemaname | relname |         last_analyze          
------------+---------+-------------------------------
 pagila     | city    | 2011-07-26 19:30:59.357898-07
 world      | city    | 2011-07-26 19:30:53.119366-07
(2 rows)

Все виды полезной информации там:

test=# \d pg_stat_all_tables           View "pg_catalog.pg_stat_all_tables"
      Column       |           Type           | Modifiers 
-------------------+--------------------------+-----------
 relid             | oid                      | 
 schemaname        | name                     | 
 relname           | name                     | 
 seq_scan          | bigint                   | 
 seq_tup_read      | bigint                   | 
 idx_scan          | bigint                   | 
 idx_tup_fetch     | bigint                   | 
 n_tup_ins         | bigint                   | 
 n_tup_upd         | bigint                   | 
 n_tup_del         | bigint                   | 
 n_tup_hot_upd     | bigint                   | 
 n_live_tup        | bigint                   | 
 n_dead_tup        | bigint                   | 
 last_vacuum       | timestamp with time zone | 
 last_autovacuum   | timestamp with time zone | 
 last_analyze      | timestamp with time zone | 
 last_autoanalyze  | timestamp with time zone | 
 vacuum_count      | bigint                   | 
 autovacuum_count  | bigint                   | 
 analyze_count     | bigint                   | 
 autoanalyze_count | bigint                   |
2 голосов
/ 02 августа 2011

Вам не нужно беспокоиться об отпуске в вашем приложении.Вместо этого на вашем сервере должен быть сконфигурирован процесс autovacpostgresql.conf), а сервер принимает процессы VACCUM и ANALYZE на основе собственной внутренней статистики.Вы можете настроить, как часто он должен выполняться, и какие пороговые переменные должны обрабатываться.

...