как автоматически определить, какие таблицы нуждаются в вакууме / переиндексации в postgresql - PullRequest
3 голосов
/ 14 июня 2009

Я написал сценарий обслуживания для нашей базы данных и хотел бы запускать этот сценарий для тех таблиц, которые больше всего требуют очистки / переиндексации во время простоя каждый день. есть ли способ определить это в пределах postgres?

Я бы классифицировал таблицы, требующие внимания, следующим образом:

  • столы, которые нужно пылесосить
  • таблиц, которые нуждаются в переиндексации (мы находим, что это сильно влияет на производительность)

я вижу что-то примерно многообещающее здесь

Ответы [ 3 ]

4 голосов
/ 25 июня 2009

Похоже, вы пытаетесь изобрести авто-пылесос. По какой-то причине вы не можете просто включить это и позволить ему выполнить свою работу?

Для получения необходимой информации, смотрите pg_stat_all_tables и pg_stat_all_indexes .

Для хорошего примера того, как использовать данные в нем, посмотрите на источник для автоматического вакуума. Он не запрашивает представления напрямую, но использует эту информацию.

0 голосов
/ 20 июля 2010

Как насчет добавления той же триггерной функции, которая запускается после любого действия CRUD, во все таблицы.

Функция получит имя таблицы, проверит состояние таблицы, а затем запустит вакуум или переиндексирование этой таблицы.

Должен быть "простой" триггер pl / sql, но тогда он никогда не бывает простым ...

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

0 голосов
/ 22 января 2010

Я думаю, что вы действительно должны рассмотреть авто-вакуум.

Однако, если я правильно понял твои потребности, я это сделаю:

  • Для каждой таблицы (сколько таблиц у вас есть?) Определите критерии;

Например, talbe 'foo' необходимо переиндексировать каждые X новых записей и очищать пылесосом каждый X обновлять, удалять или вставлять

  • Напишите ваше собственное заявление, чтобы сделать это.

Каждый день он проверяет состояние таблиц, сохраняет его в журнале (чтобы сравнить разницу строк по времени), а затем переиндексирует / вакуумирует таблицы, соответствующие вашим критериям.

Звучит немного хакерски, но я думаю, что это хороший способ сделать custom-autovacuum-with-custom-'triggers'-criteria

...