Трассировка SQL-запросов платформы 1С:Предприятие 8

07 сентября 2013

Трассировка

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

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

Сегодня в статье мы рассмотрим инструменты, с помощью которых можно выполнить трассировку SQL-запросов платформы 1С:Предприятия 8, а также приведем пошаговое описание действий для выполнения трассировки. Примеры ниже выполняются на СУБД MS SQL Server 2012 и платформе 1С:Предприятие 8.2.

Инструменты

Для трассировки запросов можно использовать встроенное в MS SQL Server приложение SQL Server Profiler. Приложение входит в комплект MS SQL Server'а начиная с версии Standart и выше. 

есплатная версия Express не содержит SQL Profiler, однако Вы можете использовать бесплатную утилиту ExpressProfiler, созданную на базе платформы .NET. Конечно, у нее намного меньше возможностей для создания и управления трассировками, но для решения простых задач утилита подходит идеально.

Главное окно ExpressProfiler

Подробнее о приложениях смотрите по приведенным выше ссылкам. Далее рассмотрим трассировку SQL-запросов платформы 1С:Предприятия при помощи SQL Profiler'а из поставки MS SQL Server'а. 

Главное окно MS SQL Profiler'а

Рассматривать же работу бесплатной утилиты не имеет смысла, поскольку принцип действий аналогичный.

И так, приступим!

Практическая задача

Вот практический пример задачи, который мы продемонстрируем на типовой конфигурации "Управление производственным предприятием" версии 1.3. У нас есть документ "Расчет себестоимости". Проведение документа занимает в среднем 5.18 секунды. Время небольшое, поскольку пример выполнен на демонстрационной базе УПП, а там внесено достаточно мало данных.

Наша задача узнать причину столь длительного процесса проведения документа. Начнем с использования стандартных средств платформы. С помощью инструмента замера производительности выясним какая строка программного кода выполняется большую часть времени. Установим точку останова в начале процедуры обработчика "ОбработкаПроведения" и в конце этой процедуры.

Устанавливаем точки останова для выполнения замера производительности

Начав проведение документа, в тот момент когда выполнение процедуры остановится на первой точке останова, запустим инструмент замера производительности через меню

"Отладка -> Замер производительности",

затем продолжим отладку. После выполнения всех действий при проведении документам по регистра, выполнение процедуры остановится на последней точке останова. Выполним ту же команду из меню "Отладка". Перед нами появится результат замера производительности, приведенный ниже:

Результат замера производительности

Как мы видим, наибольшую часть времени выполняется строка (18% времени проведения документа), вызываемая из общего модуля "ПроцедурыРасчетаСебестоимостиВыпуска":

РезультатЗапросаПоНезавершенномуПроизводству = 
        ЗапросПоНезавершенномуПроизводству.Выполнить(); 

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

Предположим, что имеющейся информации для решения проблемы у нас недостаточно и нам нужно получить SQL-запрос платформы, выполнить трассировку.

Отлавливаем запрос

Теперь мы точно знаем где искать проблему. Поставим точку останова на проблемной строчке кода и запустим проведение документа в режиме отладки.

Устанавливаем точку останова на "проблемной" строке

Когда выполнение программного кода остановится на указанной точке останова - запустим MS SQL Profiler. Перед нами откроется главное окно приложения. Создадим новую трассировку через меню:

"Файл -> Создать трассировку"

Перед нами откроется окно свойств трассировки. На первой закладке изменим имя трассировки.

Окно свойств трассировки

На вкладке "Выбор событий" установим отбор на те события, которые должны попадать в трассировку. Нас интересует событие "RPC:Compleated", которое предоставляет информацию о тексте SQL-запроса, времени его выполнения и т.д.

Отбор событий трассировки

Нажмем "Запустить" и увидим пустой журнал событий созданной нами трассировки.

Начало трассировки

Перейдем в конфигуратор, где в отладке было остановлено выполнение проведения документа "Расчет себестоимости". Выполним команду "Шагнуть через".

Платформа выполнит запрос по незавершенному производству. При этом в журнале событий созданной нами трассировки появится запись следующего содержания:

Результат трассировки

Трассировка содержит текст SQL-запроса, время выполнения, нагрузку на CPU и прочее. Из этого события мы также можем получить фактический план выполнения запроса. Для этого сохраним данные события в файл:

Затем, открыв сохраненный файл в MS SQL Managment Studio и включив действительный план запроса, выполним его и увидим следующее:

Действительный план выполнения запроса

Снизу окна мы видим графическое представление действительного плана выполнения запроса.

По этим данным мы уже можем узнать причины неоптимального выполнения операции и предложить решения по оптимизации.

Итог

Умение выполнять трассировку SQL-запросов платформы 1С:Предприятия позволяет значительно расширить возможности по оптимизации прикладного решения. 

В статье мы рассмотрели простейший пример отлавливания SQL-запроса платформы и связанных с ним данных. Целью было показать сам принцип отлавливания SQL-запросов платформы, а не дать рекомендации по оптимизации прикладного решения.

На этом описанном выше принципе работы построены практически все приложения для выполнения трассировок, в том числе и упомянутый в начале статьи бесплатный ExpressProfiler.

Бесплатная утилита ExpressProfiler

В конечном счете только с помощью трассировки Вы можете выявить точную причину неоптимального выполнения запроса при решении сложных задачах (недостающий индекс и др.).

 


comments powered by Disqus