К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как получить план запроса в 1С и проанализировать его

Способы получить план запроса в 1С: консоль запросов с планом выполнения, технологический журнал, средства MS SQL и PostgreSQL. Разбор типичных ошибок оптимизации.

План запроса показывает, как СУБД собирается выполнять запрос: какие индексы использует, в каком порядке соединяет таблицы, сколько строк ожидает на каждом шаге. Без плана оптимизация запроса в 1С превращается в гадание — вы меняете текст наугад и не понимаете, почему запрос стал быстрее или медленнее.

В экосистеме 1С есть несколько путей получения плана: встроенные возможности консоли запросов, технологический журнал платформы и штатные инструменты самой СУБД (MS SQL Server, PostgreSQL, Oracle). Каждый способ даёт разный уровень детализации и подходит для своих задач.

Ниже разобраны рабочие способы получения плана, настройка технологического журнала для перехвата медленных запросов, а также типичные признаки проблемного плана и ошибки, которые делают при анализе.

Что такое план запроса и когда он нужен

План запроса — это дерево операций, которое строит оптимизатор СУБД перед выполнением: сканирование таблиц, поиск по индексам, соединения, сортировки, агрегации. Один и тот же запрос может выполняться миллисекунды или минуты в зависимости от того, какой план выбрал оптимизатор.

Анализ плана нужен, когда запрос или отчёт работает медленно, когда документ проводится неприемлемо долго, когда пользователи жалуются на «подвисания» при открытии форм. Также план полезен для проверки после оптимизации: вы сравниваете план до и после изменения запроса и убеждаетесь, что индекс реально задействован, а сканирование таблицы исчезло.

Важно понимать двуслойность проблемы: платформа 1С транслирует запрос на встроенном языке в SQL, и итоговый SQL-текст может существенно отличаться от того, что написал разработчик. Поэтому анализировать нужно именно тот SQL, который ушёл на сервер, а не только исходный текст запроса в конфигураторе.

Получение плана через консоль запросов

Самый доступный способ — консоль запросов. Штатная консоль из состава типовых инструментов разработчика (ИР) и многие сторонние консоли умеют показывать план выполнения запроса. Порядок работы обычно такой: открываете консоль в режиме предприятия, вставляете текст запроса, заполняете параметры и запускаете выполнение с включённой опцией показа плана.

Инструменты разработчика (ИР) — наиболее функциональный вариант: консоль запросов ИР показывает текст SQL, который платформа сформировала из запроса 1С, и план его выполнения в терминах СУБД. Это позволяет увидеть связь между конструкциями языка запросов 1С и реальными операциями на уровне базы данных.

Если используете простую консоль без функции плана, скопируйте из неё хотя бы итоговый SQL-текст и параметры — их затем можно выполнить напрямую в среде управления СУБД и получить план там.

Порядок действий в консоли запросов
  1. 1
    Откройте консоль запросов в режиме предприятия под пользователем с достаточными правами
  2. 2
    Вставьте текст запроса и заполните все параметры реальными значениями
  3. 3
    Включите опцию показа плана выполнения (в ИР — соответствующая кнопка на панели)
  4. 4
    Выполните запрос и изучите план: ищите сканирования таблиц вместо поиска по индексу
  5. 5
    Сохраните текст SQL и план для сравнения после оптимизации

Перехват запроса через технологический журнал

Когда проблемный запрос выполняется не из консоли, а из кода конфигурации — при проведении документа, построении отчёта, обмене данными — его сначала нужно поймать. Для этого служит технологический журнал платформы: он фиксирует все обращения к СУБД с текстом SQL, длительностью и контекстом.

Настройка сводится к созданию файла logcfg.xml в каталоге конфигурации технологического журнала на сервере 1С. В файле описываются события, которые нужно фиксировать: для MS SQL это DBMSSQL, для PostgreSQL — DBPOSTGRS, плюс событие EXCP для исключений. Дополнительно указывают порог длительности, чтобы не собирать лишнее.

После воспроизведения проблемы журнал анализируют: находят события с большой длительностью, извлекают SQL-текст и параметры, затем выполняют этот SQL в среде СУБД и смотрят план. Для разбора больших журналов удобно использовать специализированные парсеры или хотя бы поиск по длительности события.

xml
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="C:\1clogs" history="24">
    <event><eq property="name" value="DBMSSQL"/></event>
    <event><eq property="name" value="EXCP"/></event>
    <property name="all"/>
  </log>
</config>

План средствами самой СУБД

MS SQL Server

Для MS SQL план смотрят в SQL Server Management Studio. Вставьте перехваченный SQL-текст в новое окно запроса, подставьте значения параметров и нажмите «Display Estimated Execution Plan» (Ctrl+L) для оценочного плана или включите «Include Actual Execution Plan» (Ctrl+M) и выполните запрос для фактического. Фактический план ценнее: он показывает реальное количество строк на каждом шаге, а не оценку оптимизатора.

Расхождение между ожидаемым и фактическим числом строк — классический признак устаревшей статистики. В таком случае помогает обновление статистики по проблемным таблицам, а не переписывание запроса.

PostgreSQL

В PostgreSQL план получают командой EXPLAIN, а для фактических показателей — EXPLAIN (ANALYZE, BUFFERS). Опция ANALYZE реально выполняет запрос, поэтому на тяжёлых запросах в боевой базе применяйте её осторожно. BUFFERS покажет чтения страниц из буферного кэша и с диска — это помогает отличить проблему плана от проблемы нехватки памяти.

sql
EXPLAIN (ANALYZE, BUFFERS)
SELECT ... FROM ваш_запрос;

Файловый режим

В файловой базе 1С отдельной СУБД нет, и классического плана запроса получить нельзя. Остаётся косвенная диагностика: замеры длительности в консоли, анализ логики запроса, проверка соединений с виртуальными таблицами. Если файловая база большая и запросы тормозят систематически — это аргумент за переход на клиент-серверный вариант, а не за тонкую оптимизацию.

Сравнение способов получения плана

Консоль запросов с планом

Быстро и удобно для разработчика; требует воспроизвести запрос вручную и не всегда совпадает с условиями боевого выполнения

Технологический журнал

Ловит реальные запросы из кода конфигурации; требует настройки logcfg.xml и разбора больших логов

Средства СУБД (SSMS, EXPLAIN)

Максимально точный фактический план; нужно извлечь SQL-текст и подставить параметры, требуются права на сервере БД

На что смотреть в плане запроса

Первое, что ищут в плане, — операции полного сканирования таблиц (Table Scan, Clustered Index Scan, Seq Scan) на больших таблицах. Их наличие там, где ожидался поиск по индексу (Index Seek, Index Scan), означает, что оптимизатор не смог подобрать индекс: либо его нет, либо условие запроса написано так, что индекс неприменим.

Второй типичный признак — большая разница между оценочным и фактическим числом строк. Оптимизатор строит план на основе статистики; если статистика устарела, он выбирает неподходящий алгоритм соединения или неверный порядок таблиц. Регулярное обновление статистики и очистка процедурного кэша — стандартная часть регламентного обслуживания баз 1С.

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

Контрольные точки

Как проверить результат оптимизации

Операции чтения данных в плане
Норма

Index Seek или Index Scan по узкому условию

Тревожный признак

Table Scan / Seq Scan по большой таблице

Оценочное и фактическое число строк
Норма

Значения одного порядка

Тревожный признак

Расхождение в десятки и сотни раз — устаревшая статистика

Длительность запроса после изменений
Норма

Замер на тех же данных показывает устойчивое ускорение

Тревожный признак

Запрос стал быстрее только из-за прогретого кэша

Типичные ошибки при работе с планом запроса

Частая ошибка — оптимизация запроса в консоли с параметрами, отличными от боевых. План сильно зависит от значений параметров и селективности условий: запрос, быстрый для одного контрагента, может сканировать всю таблицу для другого. Проверяйте план на репрезентативных и на «плохих» значениях параметров.

Вторая ошибка — выводы по одному замеру. Первое выполнение запроса читает данные с диска, повторное — из кэша, и разница во времени не имеет отношения к качеству плана. Сравнивайте планы и логические чтения, а не только секунды на секундомере.

Третья ошибка — попытка лечить всё созданием индексов. Лишние индексы замедляют запись и увеличивают размер базы. В 1С индексирование большинства стандартных реквизитов уже определено конфигурацией, а добавлять произвольные индексы на уровне СУБД в обход платформы следует только с пониманием последствий при обновлениях.

Типичные ошибки
01
Оптимизация на нереалистичных параметрах — план не совпадает с боевым, выводы неверны
02
Сравнение длительности по одному замеру — влияние кэша маскирует реальный эффект
03
Добавление индексов напрямую в СУБД без анализа — замедление записи и риски при обновлении конфигурации
04
Игнорирование расхождения оценки и факта строк — корень проблемы в статистике, а не в тексте запроса
05
Соединение с виртуальными таблицами без отборов — платформа строит тяжёлый подзапрос по всему регистру

Практические рекомендации по оптимизации

После получения плана работайте по приоритетам. Сначала устраните сканирования больших таблиц: проверьте, что условия накладываются на индексированные поля, а в запросах к виртуальным таблицам заданы отборы по измерениям. Затем посмотрите на порядок соединений: в запросах 1С помогает явное сокращение выборки на ранних этапах через временные таблицы.

Пакетное выполнение с временными таблицами — один из самых эффективных приёмов: вы сначала отбираете узкое множество данных во временную таблицу с индексом, а потом соединяете её с остальными таблицами. Это даёт оптимизатору понятную и дешёвую структуру плана.

Если план корректный, статистика свежая, а запрос всё равно медленный — смотрите шире: блокировки от конкурирующих сеансов, нехватку памяти на сервере СУБД, фрагментацию индексов. План запроса — необходимый, но не единственный инструмент диагностики производительности.

Маршрут решения

Как выбрать действие

Запрос можно воспроизвести вручную и есть консоль с планомПолучите план в консоли запросов (ИР) — это самый быстрый путь
Запрос выполняется из кода конфигурации и неизвестно гдеНастройте технологический журнал с DBMSSQL/DBPOSTGRS и перехватите SQL
SQL-текст получен, но нужен точный фактический планВыполните SQL в SSMS с Include Actual Execution Plan или EXPLAIN ANALYZE в PostgreSQL
В плане расходятся оценка и факт числа строкОбновите статистику по таблицам и проверьте план повторно
База файловая и запросы систематически медленныеРассмотрите переход на клиент-серверный режим вместо тонкой оптимизации
Итог

Что важно запомнить

План запроса получают тремя путями: консоль запросов с функцией плана, технологический журнал для перехвата реальных запросов и средства СУБД для точного анализа. В плане ищут сканирования таблиц, расхождение оценки и факта строк, тяжёлые соединения. Оптимизацию проверяют сравнением планов, а не одиночными замерами времени.

Частые вопросы

Можно ли получить план запроса без доступа к серверу СУБД?

Да. Консоль запросов с функцией показа плана (например, в инструментах разработчика ИР) работает из режима предприятия и не требует прямого доступа к серверу баз данных. Доступ к СУБД нужен только для самого детального анализа с фактическими показателями выполнения.

Почему план в консоли отличается от плана того же запроса в боевом режиме?

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

Что делать, если в плане сканирование таблицы, хотя индекс есть?

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

Опасно ли выполнять EXPLAIN ANALYZE в боевой базе PostgreSQL?

Опция ANALYZE реально выполняет запрос, включая все его чтения и, если это запрос на изменение, саму модификацию данных. Для SELECT риск ограничивается нагрузкой на время выполнения; запросы на изменение данных через EXPLAIN ANALYZE в боевой базе выполнять не следует — используйте копию базы.

Как понять, что проблема не в плане, а в блокировках?

Если план оптимален, но запрос «висит», проверьте ожидания: в MS SQL — представления sys.dm_tran_locks и sys.dm_os_waiting_tasks, в 1С — события TLOCK и TDEADLOCK технологического журнала. Характерный признак — запрос выполняется быстро в тесте и медленно только при параллельной работе пользователей.

Нужно ли обновлять статистику вручную, если СУБД делает это автоматически?

Автообновление статистики срабатывает по порогу изменения данных и может отставать на быстрорастущих таблицах регистров. Для баз 1С рекомендуется регламентное обновление статистики (например, ежедневно в нерабочее время) — это снижает риск внезапной смены планов на неудачные.