Out of memory на PostgreSQL при выполнении «тяжелых» операций 1С:Предприятие

Когда-то давно задавал вопрос на партнерском форуме 1С, а сейчас решил выложить в общий доступ.

Исходные данные:

  • Платформа: 1С:Предприятие 8.1 (8.1.15.14)
  • Кофигурация:  БП 1.6.24.7 (Конфигурация типовая, на поддержке). Ситуация может воспроизвестись на любой конфигурации.
  • Сервер СУБД:  Postgres 8.3.8 (сборка 1с)
  • ОС: Debian Lenny 5.0 (Linux  2.6.26-2-686-bigmem i686 GNU/Linux)
  • Физ: на сервере 8Гб памяти,  параметры остального оборудования думаю не критичны.
  • Воспроизводимость  100% 🙂

При  закрытии месяца вылетает с ошибкой: Ошибка СУБД. ERROR: Out of  memory. DETAIL: Failed on request size 8388608

Решение:

  • enable_mergejoin=off (в .conf файле или через SET в консоли/PgAdmin)

Подробно:

Проблема в оптимизаторе, который выбирает неудачный план(merge join), требующий большого объема памяти и большого времени для выполнения запроса.

Комментарий с postgresql.org (нужное подчеркнул)

«If the default plan chosen by the optimizer for a particular query is not optimal, a temporary solution can be found by using one of these configuration parameters to force the optimizer to choose a different plan. Turning one of these settings off permanently is seldom a good idea, however. «

Что такое mergejoin? Алгоритм соединения слиянием сортированных списков (merge join, sort merge join, sort-merge join) — разновидность алгоритма соединения. Алгоритм получает на вход 2 таблицы и условие соединения. Результатом его работы является таблица с результатами соединения. Главным недостатком алгоритма является необходимость в предварительной сортировке списков. Накладные расходы на сортировку могут быть неприемлемо высокими.

Ссылка на обсуждение: http://partners.v8.1c.ru/forum/thread.jsp?id=791403#791403

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *