Перейти к содержимому

Отбор по субконто ставить на правильный уровень запроса

Директивный

v8std#std487

#запросы#производительность#проведение

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

  • При жалобе на «иногда долго проводится» — снимать план запроса (PostgreSQL), а не гадать; подозреваемый №1 — отбор по субконто/составному измерению.
  • Проверять, что отбор применяется на уровне, где есть индекс и нет полного перебора; при необходимости — вложенный запрос/временная таблица.

Виртуальная таблица — это не таблица, а подзапрос с группировкой, который платформа разворачивает на лету. Отбор из её параметров оказывается внутри этого подзапроса, и для субконто/составного измерения (хранится как пара «тип + ссылка», у бухрегистров — в отдельной таблице значений субконто) оптимизатор часто не может использовать индекс — план деградирует до полного перебора всей таблицы регистра. Коварство в том, что деградация выборочная: у одних значений отбора план нормальный, у других — перебор, поэтому «иногда долго проводится» и не воспроизводится на тесте.

  • Симптом: разброс времени одинаковых операций — сопоставимые документы проводятся за секунды и за минуты.
  • Снять план запроса (техножурнал DBPOSTGRS/DBMSSQL или логи СУБД), а не гадать: искать полный перебор (seq scan) большой таблицы регистра.
  • Подозреваемый №1 — отбор по субконто/составному измерению в параметрах виртуальной таблицы; подтверждается переносом отбора и повторным замером (см. перф-прогон горячих мест).

Перепроведение внутригрупповых поступлений: часть документов перепроводилась 45 секунд против 1–1,5 секунды у сопоставимых, отдельные поступления — по 1,5–3 минуты. Зависание локализовалось в типовом методе УчётВзаиморасчётов.ПолучитьОстаткиАвансов — именно на отборе по субконто контрагента; перенос отбора «на следующий уровень» вернул нормальное время. Та же первопричина потянула за собой соседние инциденты — многочасовое групповое перепроведение и непроходящее ТиИ: один неудачный уровень отбора в часто вызываемом методе оплачивается везде, где этот метод дергается.

Если по субконто есть подходящий индекс и план стабилен — переносить отбор не нужно. Правило про случаи деградации плана, подтверждённые замером.