В этой статье поговорим о статистике в PostgreSQL.

1. Симптомы неактуальной статистики в базе.
2. Как обновляется статистика в PostgreSQL и надо ли ее обновлять принудительно?
3. Как обновить статистику в PostgreSQL вручную?

Симптомы неактуальной статистики в базе.

В какой-то момент(в какой именно теперь уже не вспомнит никто) тестовая база начала сильно тормозить, при низкой загрузке оборудования.

При чем некоторые действия продолжали выполняться с приемлемой скоростью, а некоторые могли выполняться ну очень долго. .

В частности, открытие списка одного из документов выполнялось 8 часов.

Для исключения из эксперимента времени работы на сервере 1С:Предприятия(формирование формы и т.д.) – мы выполнили запрос динамического списка в консоли запросов(БЕЗ вывода результата запроса в табличный документ).

Окончательно убедившись, что бОльшая часть времени выполнения – это время, которое было потрачено на выполнение запроса СУБД, мы выполнили сбор плана запроса в технологическом журнале.

По плану запроса мы увидели некоторую особенность: изобилие операторов nested loop:

При ближайшем рассмотрении можно увидеть, что в таблице сканирования индекса при оценке количества строк есть колоссальное расхождение с фактически полученным числом строк:

Это связано с тем, что по данным статистики оптимизатор предполагал, что получить всего 1 строку. Поэтому им в качестве оператора был выбран nested loop. А в результате получил 15215 строк. Использование nested loop на таком количестве строк и привело к деградации производительности.

Могло ли такое случиться при включенной настройке autovacuum? Ведь в этом случае команда ANALYZE выполняется автоматически…

Но не все так просто.

Как обновляется статистика в PostgreSQL и надо ли ее обновлять принудительно?

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

То есть, автоматический запуск ANALYZE зависит только от количества вставленных или изменённых строк. Как при этом измененные строки влияют на статистику – не учитывается.

Поэтому в некоторых случаях может понадобится запуск обновления статистики вручную.

Как обновить статистику в PostgreSQL вручную?

Авторизуемся под postgres.

Заходим в терминал PostgreSQL.

Подключимся к базе.

Выполним команду сбора статистики по интересующим таблицам.

Либо в целом по базе:

В результате после выполнения сбора статистики план открытия списка документов оказался следующий:

Видим, что вместо nested loop используются более оптимальные для такого количества строк операторы соединения.

Список открывается практически мгновенно.