Правило
Заголовок раздела «Правило»В запросах к регистрам с составными измерениями/субконто (контрагент, договор и т.п.) не вешать отбор по субконто на верхнем уровне виртуальной таблицы, если это деградирует план. Тяжёлый отбор выносить на следующий уровень/во вложенный запрос и проверять по плану.
- При жалобе на «иногда долго проводится» — снимать план запроса (PostgreSQL), а не гадать; подозреваемый №1 — отбор по субконто/составному измерению.
- Проверять, что отбор применяется на уровне, где есть индекс и нет полного перебора; при необходимости — вложенный запрос/временная таблица.
Виртуальная таблица — это не таблица, а подзапрос с группировкой, который платформа разворачивает на лету. Отбор из её параметров оказывается внутри этого подзапроса, и для субконто/составного измерения (хранится как пара «тип + ссылка», у бухрегистров — в отдельной таблице значений субконто) оптимизатор часто не может использовать индекс — план деградирует до полного перебора всей таблицы регистра. Коварство в том, что деградация выборочная: у одних значений отбора план нормальный, у других — перебор, поэтому «иногда долго проводится» и не воспроизводится на тесте.
Как обнаружить
Заголовок раздела «Как обнаружить»- Симптом: разброс времени одинаковых операций — сопоставимые документы проводятся за секунды и за минуты.
- Снять план запроса (техножурнал
DBPOSTGRS/DBMSSQLили логи СУБД), а не гадать: искать полный перебор (seq scan) большой таблицы регистра. - Подозреваемый №1 — отбор по субконто/составному измерению в параметрах виртуальной таблицы; подтверждается переносом отбора и повторным замером (см. перф-прогон горячих мест).
Правильно
Заголовок раздела «Правильно»Пример из практики
Заголовок раздела «Пример из практики»Перепроведение внутригрупповых поступлений: часть документов перепроводилась
45 секунд против 1–1,5 секунды у сопоставимых, отдельные поступления — по
1,5–3 минуты. Зависание локализовалось в типовом методе
УчётВзаиморасчётов.ПолучитьОстаткиАвансов — именно на отборе по субконто
контрагента; перенос отбора «на следующий уровень» вернул нормальное время.
Та же первопричина потянула за собой соседние инциденты — многочасовое групповое
перепроведение и непроходящее ТиИ: один неудачный уровень отбора в часто
вызываемом методе оплачивается везде, где этот метод дергается.
Когда не применять
Заголовок раздела «Когда не применять»Если по субконто есть подходящий индекс и план стабилен — переносить отбор не нужно. Правило про случаи деградации плана, подтверждённые замером.