Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности

Публикация № 1492368 07.09.21

База данных - HighLoad оптимизация

мониторинг производительности MSSQL Profiler

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

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

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

Мы хотим показать, как выглядит оптимизация запросов из статьи о распространенных ошибках разработчиков с точки зрения SQL сервера.

Дополнительно мы надеемся, что по результатам прочтения статьи вы сможете:

  1. Настроить и подключить профайлер
  2. Получить/увидеть схему плана запроса, технологические данные - длительность (duration), нагрузку на CPU и др.
  3. Сделать некоторую "грубую" оценку - оценить: стало лучше, не изменилось или хуже (в большинстве случаев этого достаточно). 

Мы ориентируемся на специалистов начального и среднего уровня. Возможно, даже господа сеньоры смогут почерпнуть для себя  что-то новое, по опыту общения с коллегами до публикации такие ситуации имели место.

 

I) Инструменты и подготовка.

 

SQL Server Profiler вам потребуется, чтобы понять, почему может тормозить запрос, проверить результаты оптимизации, когда анализа кода на языке 1С недостаточно. В большинстве случаев результирующий запрос выглядит монстром (почти 95% из-за RLS), и понять там что-либо можно с трудом. В этом случае вам может помочь SQL Sentry Plan Explorer, который поможет выделить самые жирные цепочки. Статей в интернете и на текущем ресурсе по этой тематике много или если вы уже знаете, как с ним обращаться, листайте дальше. Но для тех, кто не знает, это будет хорошим кратким описанием.

 

1. Начинаем и запускаем SQL Server Profiler.

1.1 Открываем Microsoft SQL Server Management Studio

1.2 Запускаем SQL Server Profiler и подключаемся к базе данных (вводим адрес, логин и пароль).

 

 

2. Настраиваем трассировку (события).

В открывшемся приложении сразу будет открыта форма настройки подключения. Если это не так, то нажмите "New trace ..." (Новая трассировка) или "Ctrl+N".

2.1 На вкладке главное (General) смотрим настройки и сохраняем как шаблон, если нужно.

2.2 Переходим на вкладку события (Events Selection) и выполняем настройку захвата интересующих нас событий. Из выбранных по умолчанию оставляем RPC.Complated, остальные отключаем.

 

 

2.3 Добавляем еще следующие события из блока Performance

  • Show plan XML Statistic Profile- схема плана запросов с данными статистики
  • ShowPlan Text (Unencoded) - текстовое представление запроса (не обязательно)
3 Ставим отборы в профайлере

3.1 Ставим отбор по базе данных. Устанавливаем фильтр на имя базы данных DatabaseName. Если не видно, то нажмите флаг "Show all columns" и выберите требуемую колонку.

 

 

3.2. Ставим отбор по длительности Duration. Этот параметр вы можете поставить, чтобы искать длительные запросы или отсеять всякие мелкие служебные. При анализе нужно руководствоваться соображениями - чем меньше этот показатель, тем лучше. Фактически - это время выполнения запроса.

 

 

3.3 Ставим отбор по тексту. Устанавливаем по слову в тексте TextData. Будем искать по вхождению некоторого ключа. Обязательно поместите его в "%" (т.е. вхождение по подобно). Подставлять ключевое слово в запрос 1С и искать это ключевое слово в запросе в профайлере - это довольно популярный и удобный подход, и мы будем его использовать.

 

 

3.4. Дополнительные информационные поля. Добавляем еще поля

  • RowCount – число записей, которые возвращает сервер.
  • Reads - количество чтений, сколько данных было прочитано.
  • Writes - количество записей, что было записано в нашем случае во временные таблицы.

3.5. Жмем кнопку "Run" (Запуск). Приложение можно сказать разделено на две части. В первой части таблица с основной информацией по запросу: Событие, Нагрузка CPU, Время выполнения (Duration) и т.д. По ним мы будем понимать/получать оценку в значениях/цифрах. Во второй части - будет приводиться информация по тексту запроса или плану запроса в графическом виде. Все картинки запросов по тексту ниже взяты из нее.

 

 

4. Запускаем SQL Sentry Plan Explorer

Как было сказано выше, этот инструмент будем использовать, когда план запроса сложный, чтобы выделить в нем самые жирные цепочки. Для выделения этих цепочек пользуйтесь фильтром "Filter" и изменяйте значение %. С увеличением этого параметра будут пропадать цепочки с "малым" вкладом в стоимость плана. Т.е. останутся только те, которые вносят самое большое влияние. 

 

 

Давайте рассмотрим, как в него загрузить данные чуть более подробно:

  • кликнем левой кнопкой мышки на строке с событием "Show Plan XML" приложения MS SQL Profiler и в появившемся окне выберем опцию "Сохранить данные события... (Extract Event Data...)". Данные сохранятся в формате плана запроса "SQLPlan".

 

 

  • Далее в приложении Plan Explorer открываем этот файл через "Открыть (Open)". В результате в данные сохраненного ранее плана загрузятся, и у вас появится возможность просмотра в более удобном варианте.

 

5. Запускаем тестируемого клиента

5.1. Открываем базу данных на платформе 1С. В нашем случае - это конфигурация ЕРП, некоторая версия с набором данных за хороший период. Запускаемся под администратором или под пользователем с ограничениями RLS (не забудьте для этого пользователя разрешить интерактивное открытие отчетов и обработок). Как вариант - можете добавить обработку в расширение и подключить ее.

5.2. Открываем консоль запросов (любую консоль запросов). И переходим к примерам. Сами примеры это текстовое представление динамического списка на языке запросов 1С с включением некоторого ключа (параметр "КлючЗапроса"), по которому далее будет накладываться фильтр в профайлере TextData, т.ч. не забудьте его добавить. Еще раз - это значение будет ловиться фильтром TextData, поэтому убедитесь что значения фильтра и параметра "КлючЗапроса" совпадают. 

 

 

II) Краткая информация про планы запросов

 

Прежде чем мы начнем смотреть, давайте введем несколько тезисов и рассмотрим краткую справку по операторам плана запросов. Мне понравилась статья на текущем ресурсе - "Зачем запросу план и кто его выполняет?"

Сначала давайте ответим на вопрос: Что же такое план запроса и зачем он нужен?

"План выполнения запроса — последовательность операций, необходимых для получения результата SQL-запроса в реляционной СУБД" - из Википедии

Т.е. на плане запроса мы видим, как SQL сервер получает и обрабатывает данные. И эта графическая (может, в формате структурированного текста) информация помогает нам выполнить оптимизацию. Однако, в рамках 1С нам доступен ограниченный набор операций по оптимизации, т.к. мы напрямую общаемся только с 1С.

Операторы:

  • Sort (Сортировка) - сортирует данные
  • Filter (Фильтр/Отбор) - фильтрует/отбирает данные согласно условию
  • Compute Scalar (Вычислить) - вычисляет выражение
  • Concatenation (Конкатенация) - объединяет все входные данные в один поток, в котором содержатся все данные (работает как оператор "ОБЪЕДИНИТЬ ВСЕ").
  • Merge Interval (Объединение различные интервалов) - объединяет интервалы, выбирает только не пересекающиеся данные, различные.
  • Select (Выбрать) - выбирает данные
  • Insert (Вставить) - создает временную таблицу
  • Key LookUp (Поиск ключа) - ищет ключ, если не хватает.
  • Table Scan (Сканирует таблицу) - ходит по всей таблице, плохо для большого количества данных.
  • Index Scan (Сканирует индекс) - считывает весь индекс.
  • Index Seek (Поиск по индексу) - считывает только данные удовлетворяющие условию.
  • Nested Loops (Соединение вложенным циклом) - пробегает по всем данным в цикле, работает всегда. Хорошо когда первая таблица маленькая, а вторая большая. При таком условии лучше Hash Match и Merge Join.
  • Hash Match (Соединение хешированием) - для соединения использует хеш, при поиске по набору ключей, работает при операторе равно "=". Может потреблять много оперативной памяти и если ее не хватит, то полезет на диск в tempdb.
  • Merge Join (Соединение слиянием) - самое быстрое слияние, требует сортировку в двух таблицах, а также наличие оператора равно "=". Хорошо на больших наборах данных.
  • Stream Aggregate (Агрегирование) - вычисляет агрегирующую функцию MAX, MIN, SUM, AVG, COUNT. по агрегируемой колонке обычно в группировках. Требует обязательную сортировку данных.

 

Тезисы:

  • Обычно чем проще и меньше структура плана запроса, тем лучше. 
  • Чем меньше данных обрабатывает SQL Server тем лучше, т.е. чем меньше чтений и записей тем система быстрее работает. 
  • Общая мудрость гласит, что поиск (seek) - это хорошо для производительности, поскольку он представляет собой прямой доступ SQL Server к требуемым строкам данных, в то время как сканирование (scan) - это плохо, поскольку он предполагает последовательное чтение индекса для извлечения большого числа строк, приводя к более медленной обработке.
  • Соединения в плане запросов. Merge Join оптимально. Nested loops нормально для небольших данных. Hash match - присмотреться (возможно надо упорядочить сначала набор или индекс иметь на поля упорядочивания, по которым идет связь).
  • Чем более высокая нагрузка, тем сложнее серверу выбрать наиболее оптимальный план запросов.

 

План запроса читается справа налево и сверху вниз. В плане для источников данных приводятся имена таблиц, которые находятся в таблицах SQL сервера. Чтобы получить обратное сопоставление (как они называются в 1С дереве конфигуратора), нужно воспользоваться специальной обработкой или функцией "ПолучитьСтруктуруХраненияБазыДанных" - возвращает таблицу значений с описаниями структуры таблиц, индексов и полей базы данных в терминах модели базы данных 1С:Предприятия или используемой СУБД.

 

 

III) Ситуации
 

1. Некоторые базовые простые ситуации

 

В данных примерах мы посмотрим только на структуру без цифровых показателей значений выполнения запроса (CPU, длительность, количество чтений и записей и др.), т.к. примеры супер простые. Проверку и просмотр проводим на ненагруженном мощном сервере. Платформа 1С 8.3.16 и MS SQL сервер 13.

В качестве начального запроса возьмем таблицу регистра накопления "Товары Организаций", в ней около 10 миллионов записей, что вполне достаточно для наших задач. Регистр накопления "Расчеты с клиентами", где 3 миллиона записей и документ "Заказ клиента", записей порядка 700 тысяч.

Для примеров ниже в профайлере необходимо отключить фильтр длительности (Duration), т.к. запросы выполняются быстро и вы их пропустите. Остальные два фильтра по имени базы и вхождению ключа в текст оставляем.

 
Простой базовый запрос
 
Добавим условие на равно
 
 Добавим условие на не равно
 
 Используем оператор "ИЛИ", "В"

 

2. Ситуации из статьи "Типовые ошибки разработчиков приводящие к проблемам".

 

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

 
Получаем данные через точку (пункт 10)
 
Еще два варианта оптимизации через точку, когда не нужны данные всех типов (доп. к пункту 10)
 
Посмотрим как ведет себя система при получении через точку, когда реквизит обычный (не составного типа) (доп. к пункту 10)
 
 Задание на перевозку и реквизит из табличной части (пункт 9)
 
 Сложный запрос в динамическом списке (пункт 11)
 
 Сложный запрос в динамическом списке с учетом RLS (доп. к пункту 11)
 
 Сложный запрос и отсутствие индекса (доп. к пункту 11)

 

IV) Как найти, увидеть на боевой базе существующие проблемы для анализа

 

В предыдущих примерах мы анализировали известные ситуации. Теперь давайте перейдем к вопросу: Как найти или увидеть проблемные ситуации в существующей рабочей базе? Что для этого необходимо сделать?

Проанализировать всю конфигурацию - это довольно сложная задача. Давайте попробуем воспользоваться более простым решением, т.к. даже "оптимальные" варианты реализации тех или иных конструкций могут преподнести неожидаемое поведение в боевых условиях на рабочем сервере. Поэтому будем смотреть техническую информацию работы реальной базы или тестового стенда, будем искать и исправлять проблемы на "лету". В качестве инструмента помощника возьмем конфигурацию "Мониторинг производительности". Вы можете использовать блокнот, ЦКК, ЦУП, монитор активности студии SQL сервера или еще другие инструменты, но мы по результатам многолетней эксплуатации пришли к заключению что этот инструмент достаточно прост, удобен и гибок, а также бесплатен и является Open Source.

 

1) Настройка и загрузка технологического журнала

 

Процесс настройки и подключения конфигурации Мониторинг производительности отлично расписан в статье "5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С".

Нам потребуется настроить получение долгих запросов. Интервалы вы можете выставить последовательно: начать с ограничения в 60 секунд, а далее снизить показатель до 10 секунд (эти пороговые значения вам лучше определить из опыта на своем окружении и они могут отличаться от рекомендованных). Мы ставим задачу поиска больших и тяжелых запросов, которые следует оптимизировать в первую очередь. Ставить значения менее некоторого порогового числа нет смысла, т.к. будет очень много информации, которую в большинстве своем нельзя оптимизировать без изменения архитектуры (много однотипных запросов).

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

 

2) Настройка и описание инструмента

 

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

Первым делом давайте откроем замер и добавим необходимые информационные поля (колонки) в динамический список "События замера" как на рисунке ниже:

 

 

Это поля:

  • Usr - пользователь, тот пользователь, под которым проявилась ситуация;
  • SessionID - номер сеанса, вы можете отследить его действия в журнале регистрации в рамках интервала, чтобы к примеру, увидеть какой документ проводился и т.п.;
  • p:processName - имя базы данных, в какой базе проявилась ситуации;
  • Context - информация по стеку кода, где ситуация произошла. Позиция кода где смотреть возникшую проблему;
  • Sql - текст запроса который выполнялся указанное время;
  • Rows - количество строк полученных по запросу. Для динамических списков обычно не большое (25-50) и с ключевым словом в запросе TOP. Полезно чтобы оценить адекватность передаваемых пользователю данных, к примеру, если передается пользователю миллионы строк данных, то значит что-то не так;
  • RowsAffected - количество строк добавленных во временную таблицу;
  • SQL:Param - параметры запроса, могут входить в Sql. Удобно чтобы посмотреть, что передавалось.

 Теперь давайте посмотрим, как выглядит у нас список:

 

 

В поле замер выбираем необходимый замер. Для нас "долгие запросы (не отчеты)".

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

В поле фильтра "длительность" устанавливаем ограничение в 60 секунд (или другое большее число - зависит от ситуации) и начинаем смотреть, что у нас набралось.

 

3) Смотрим ситуации и анализируем

 

А) Пример "поиск подобно по всем колонкам".

Открываем понравившуюся нам позицию и начинам анализировать. Ставим курсор на выбранную строку:

 

 

Из контекста видно, что проблемная ситуация находится в динамическом списке "Сделки с клиентами". Давайте посмотрим почему у нас появился этот запрос в топе, т.к. сам запрос на языке запросов 1С выглядит достаточно просто и в нем нет особых проблем.

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

 Далее посмотрим свойства параметров и обратим внимание на наличие "%" и вхождения в запрос оператора языка запросов "ПОДОБНО (LIKE)". Двойной клик на полях соответствующих колонок "Sql" и "SQL:Param".

 

 

Количество вхождений параметров говорит нам о выполнении общего поиска по всем колонкам. Что мы можем увидеть на картинке ниже. Ситуацию усугубляет, то что пользователь дополнительно ограничивается RLS. 

 

 

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

 

Б) Выбор необоснованного количества данных.

 

Давайте посмотрим следующий пример, который на рисунке ниже.

 

 

Как мы видим, то происходит создание временной таблицы с количеством строк "RowsAffected" с более чем 620 тысяч строк. Это действительно большое количество для данных. Давайте посмотрим где это произошло по колонке "Context".

 

 

Это выполняется внешняя обработка, а позиция находится в модуле объекта и именно выполнение запроса.

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

 

Б) Сортировки по неиндексированным полям в динамическом списке

 

Давайте посмотрим, что у нас с самым популярным списком в базе ЕРП. Как вы догадались, то это список называется "Заказы клиентов". Самое обидное что в этом примере пользователь получил пустой список и ждал более 2х минут.

 

 

Контекст запроса: "ДинамическийСписок.ПолучитьДанные : Документ.ЗаказКлиента.Форма.ФормаСпискаДокументов.Реквизит.Список".

Первым делом поглядим на наличие подобно, его нет. Давайте посмотрим на еще один интересный оператор запросов "УПОРЯДОЧИТЬ ПО (ORDER BY)". Для этого возьмем запрос из колонки "Sql" посмотрим на него внимательней.

 

 

Как мы видим с вами, то сортировка присутствует и в него добавлено поле "Партнер". Дополнительно на быстродействие влияет наличие сложной RLS по этому пользователю. Также мы видим наличие некоторого количества отборов, в которые входит и партнер (не приведено на снимках экрана). 

Пользователь при запросе от сотрудника сопровождения (поддержка) объяснил, что сортировку поставил случайно (кликнул по этому полю). 

Резюме: Нам требуется убрать сортировку из динамического списка по неподходящему полю или выполнить его индексирование. Также можно взять консоль запросов и под этим пользователем посмотреть как меняется поведение (это можете сделать самостоятельно).

 

Г) Сложный запрос и дальнейший анализ по схеме выше

 

Давайте возьмем следующую позицию для запроса:

 

 

Открываем контекст и смотрим:

 

 

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

 

 

Мы видим, что это "ЖурналДокументов.Взаимодействия". В запросе нет поиска по подобно и сортировки по "плохим" полям. Давайте откроем эту форму списка и посмотрим на запрос:

 
 Запрос формы списка взаимодействия

Резюме: В списке нам не видно каких-то особых проблем, он достаточно простой. Дальнейшее расследование причин необходимо осуществлять с применением профайлера.

 

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

 

V) РЕЗЮМЕ

 

  1. Оптимизатор плана запроса в MS SLQ сервер очень умный (если так можно сказать про программу) и он хорошо выполняет свою работу. Для того чтобы он правильно работал необходимо следить за актуальностью статистики, использовать другие процедуры обслуживания сервиса. Некоторые рекомендации от вендора смотрите тут: Регламентные операции на уровне СУБД для MS SQL Server
  2. Следите внимательно и не допускайте использования реквизитов в запросах через точку для составных типов.
  3. Всегда где это возможно используйте отборы - по дате, по периоду, по организации, контрагентам, и т.п. 
  4. Избегайте где возможно использования в динамических списках общего поля поиска, отключайте, удаляйте, заклеивайте его.
  5. Обращайте внимание на наличие в схеме плана запроса оператора KeyLookUP - это говорит об отсутствии необходимых индексов. Однако, в типовых конфигурациях из-за наличия общих разделителей необходимо будет просматривать и анализировать каждый такой оператор, чтобы их отсеять. Добавление этих разделителей значительно ухудшило информативность схемы плана запросов и снизило возможности оптимизации, т.к. работа с этими реквизитами осуществляется платформой.
  6. Для очень сложных планов запросов используйте Plan Explorer и ищите "жирные" потоки данных, для того чтобы понять откуда идут проблемы. Если жирных потоков нет, то скорее всего требуется пересмотреть архитектуру решения. 
  7. Проблема для динамических списков может иметь простое объяснение - прежде чем открывать профайлер посмотрите на наличие в тексте запроса "паразитных" вхождений: ПОДОБНО (LIKE), УПОРЯДОЧИТЬ ПО (ORDER BY), СГРУППИРОВАТЬ ПО (GROUP BY) - это могут быть признаки неоптимальной работы с элементом интерфейса.
  8. Обращайте внимание на "огромные" количества получаемых данных или помещаемых во временные таблицы - это может говорить о том что не хватает фильтров или про некорректные алгоритмы процедур.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Dmitryiv 156 07.09.21 11:42 Сейчас в теме
Годный контент!
METAL; IvanGorbunov; bulpi; akR00b; sinichenko_alex; user790708; dvissarov5; ivanov660; +8 Ответить
7. sinichenko_alex 161 07.09.21 16:01 Сейчас в теме
(1) Очень годный! Именно такими статьями должен пополняться Инфостарт!
2. lunjio 65 07.09.21 13:08 Сейчас в теме
Поставлю плюс, советы дельные, хоть их не так уж и много, особенно первый. Планы обслуживания по статистике, реиндексация (перестроение и пересоздание), первое что надо настраивать на сервере баз данных.
3. ivanov660 3894 07.09.21 13:16 Сейчас в теме
(2)Предложите еще варианты. Мне будет интересно прочитать.
4. cdiamond 228 07.09.21 13:54 Сейчас в теме
Опять плохому учите - Profiler давно устарел, для трассировки принято использовать Extended Events прямо в MS SQL Management Studio.
rozer; ProgrammistC; orfos; +3 Ответить
5. ivanov660 3894 07.09.21 14:24 Сейчас в теме
(4)Можете привести примеры сравнения, чем лучше новый инструмент (в чем его преимущество) в рамках поставленной задачи? Спасибо.
sinichenko_alex; +1 Ответить
15. cdiamond 228 07.09.21 20:11 Сейчас в теме
(5) этот устаревший инструмент попросту уберут в будущих выпусках MS SQL Server. Лучше сразу на Extended Events, тем более что он в базе своей очень похож на профайлер и вам стоило всего лишь спуститься по меню SQL Management Studio вниз, найти вкладку инструмента и снять почти такие же скриншоты, без потери логики статьи, которая сама по себе прекрасна, только инструмент ошибочно выбран. Советую вам отредактировать.
16. ivanov660 3894 07.09.21 21:31 Сейчас в теме
(15)Спасибо, за замечание. Дополню статью.
18. evvakra 290 08.09.21 15:03 Сейчас в теме
(16) Самое главное почему следует использовать механизм расширенных событий, так это потому что этот механизм меньше нагружает СУБД по сравнению с профайлером.
Цитата с сайта Майкрософт: "Расширенные события — это упрощенная система мониторинга производительности, в которой применяется минимальный объем ресурсов."

НО, этот механизм появился только в 2014 MS SQL. Соответственно для древних систем только профайлер, только хардкор)
METAL; akR00b; ivanov660; +3 Ответить
6. John_d 4558 07.09.21 14:36 Сейчас в теме
Давно писал статью "Отлавливаем запрос 1С в profiler на MS SQL". Она попроще, но может кому-то пригодится.
https://infostart.ru/1c/articles/965250/
8. tormozit 6872 07.09.21 16:38 Сейчас в теме
Ловить выполненный в СУБД запрос вместе с XML планом при выполнении запроса 1С можно без вникания во все дебри профайлера или расширенных событий.
YPermitin сделал классный инструмент для этого https://infostart.ru/public/1175954
Я добавил аналогичную фичу в ИР https://www.hostedredmine.com/issues/926150
JohnyDeath; fancy; rozer; +3 Ответить
9. ivanov660 3894 07.09.21 17:05 Сейчас в теме
(8)
1. Вы все молодцы.
2. Но я считаю (и не только я), что должны быть обязательно основы и база. И хотя бы чуть чуть вникать нужно, а особо глубоко бессмысленно с точки зрения 1С.
3. Я не использую ИР.
4. Обработка YPermitin подойдет в качестве альтернативы консоли из примера.
5. Не всегда возможно идти от 1С, иногда мы делаем анализ от SQL в 1С. Пока для второго случая адекватного я решения не нашел.
METAL; Nefilimus; akR00b; +3 Ответить
10. tormozit 6872 07.09.21 17:46 Сейчас в теме
5. В ИР есть решение - из конвертора текста БД можно сгенерировать фильтр техножурнала для отлова контекста вызова такого запроса https://www.hostedredmine.com/issues/924526 . Но те, кто не используют ИР, конечно не смогут его найти =)
11. ivanov660 3894 07.09.21 17:52 Сейчас в теме
(10)Немного не то, о чем я спрашивал, но спасибо посмотрю идею реализации. Встречаются ситуации, когда мы с SQL получаем проблемный запрос без контекста и тут появляется вопрос, а откуда он пришел.
У каждого разработчика свой набор инструментов разработки)
12. tormozit 6872 07.09.21 18:05 Сейчас в теме
(11) Тогда уточни свой вопрос.
13. ivanov660 3894 07.09.21 18:40 Сейчас в теме
(12)Опишу ситуацию:
1. Мы получили из Активного Монитора Студии (Active Monitor из SQL Server Management Studio) текст SQL запроса, который попал в топ.
2. Теперь мы хотим узнать где такой расположен в конфигурации ЕРП: список, общий модуль, обработка и т.п., чтобы найти точку входа и провести дальнейшие разборы полетов.
3. Для этого я "на коленке" набросал обработку, которая заменяет таблицы и поля SQL в представление 1С. Но так как получается довольно приблизительно, поэтому начинаем гадать где могут встречаться такие таблицы, комбинации полей. И не всегда быстро доберешься до этой позиции.

Вот как еще можно решить данную обратную ситуацию?
14. tormozit 6872 07.09.21 18:54 Сейчас в теме
(13) Теперь понял. Но способ все же остается тем же, который я упомянул - нужно взять первый кусок текста SQL, заменить в нем вероятно динамические части на управляющий символ "любая строка" и на основе него создать фильтр для техножурнала. Затем нужно повторить или дождаться исполнения этого запроса и тогда увидишь все контексты встроенного языка, его выполняющие. Других достаточно надежных вариантов в текущей платформе просто нет.

Ну а перевод текста БД в термины метаданных конечно может помочь найти такой контекст, но это при высоком везении (например встретилась редкая комбинация таблиц) и уровне знакомства с кодом исследуемой базы.
17. dsdred 2612 08.09.21 06:46 Сейчас в теме
Конвертор запросов очень напомнил Монитор от Андрея Бурмистрова
19. ildary 20 10.09.21 08:56 Сейчас в теме
Большое спасибо за Ваши статьи!
ivanov660; +1 Ответить
20. user729951 20.09.21 05:32 Сейчас в теме
Добрый день.
Спасибо за статью.
Добавлю немного. Не соглашусь с резюме в п. 3.А., поиск в динамических списках не нужно отключать, его нужно уметь готовить.
Используйте полнотекстовый поиск данных. Благодаря ППД удалось ускорить поиск при настроенном RLS в 120 раз (с 360 секунд до 3-х).
Также замечено что чем меньше вводим слов в строке поиска тем быстрее работает.

Статьи в помощь:
1. Полнотекстовый поиск в 1С. №1 Грабли в динамических списках https://infostart.ru/1c/articles/1056842/
2. Полнотекстовый поиск в 1С. №2 Самое основное для разработчика https://infostart.ru/1c/articles/1278933/
21. ivanov660 3894 20.09.21 09:51 Сейчас в теме
(20)Крупные игроки говорят о необходимости отключения полнотекстового поиска, особенно для высоконагруженных систем. И у нас действительно было замечены проблемы с падением хостов из-за работы этого механизма, одним из факторов тут выступает большой объем данных.
Действительно при использовании полнотекстового поиска быстрее, т.к. сначала поиск производится по "текстовой базе 1С", а уже потом применяется к спискам, т.е. фактически исчезают обращения подобно.
22. user729951 20.09.21 10:51 Сейчас в теме
(21) Если не секрет, крупные это сколько пользователей и размер базы?
Падение rphost на какой версии платформы было (баги исправляются) ?
23. redfred 26.10.21 13:45 Сейчас в теме
Общая мудрость гласит, что поиск (seek) - это хорошо для производительности, поскольку он представляет собой прямой доступ SQL Server к требуемым строкам данных, в то время как сканирование (scan) - это плохо, поскольку он предполагает последовательное чтение индекса для извлечения большого числа строк, приводя к более медленной обработке


Слишком уж категоричное заявление. Seek запросто может вычитать всю таблицу (индекс) полностью, а scan - всего несколько нужных строк.
24. Manticor 66 20.04.22 19:13 Сейчас в теме
Друзья, всем привет.
Подскажите пожалуйста что нужно сделать, чтобы отсеять лишний хлам в профайлере???
Мне нужно отловить элементарный запрос.
Я пробовал играться с отбором duration. Но ничего не помогает. Очень много времени отнимает тыкать по всем строчкам(((.
Как сделать вывод самого нужного - текста самого запроса на стороне SQL, графическая схема, текстовая схема запроса. Без вывода служебных запросов.
Привожу в пример скрин. Это профайлер так поймал следующий элементарный запрос:

ВЫБРАТЬ
    Товары.Ссылка
ИЗ
    Справочник.Товары КАК Товары
ГДЕ
    Товары.Ссылка В (&СписокТоваров)
Прикрепленные файлы:
25. ivanov660 3894 20.04.22 21:34 Сейчас в теме
(24)Посмотрите еще раз про использование фильтра по полю TextData и добавления в запрос отдельного поля КлючЗапроса. Эти значения должны совпадать.
Пример:

ВЫБРАТЬ
    Товары.Ссылка,
   "test_key_12345" Как КлючЗапроса
ИЗ
    Справочник.Товары КАК Товары
ГДЕ
    Товары.Ссылка В (&СписокТоваров)


По значению "test_key_12345" надо будет установить фильтр TextData .
26. Manticor 66 21.04.22 19:32 Сейчас в теме
(25) Спасибо большое. Очень помогли).
Оставьте свое сообщение

См. также

Применение cтандартов и методик разработки конфигураций на практике

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

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

15.05.2023    3838    improg    54    

55

Пример многопоточной обработки (БСП)

Обработка документов HighLoad оптимизация Обработка справочников БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка-шаблон, на основе которой можно делать свои многопоточные обработки данных для конфигураций на БСП.

13.02.2023    6229    4    echo77    8    

76

Разбор технологического журнала без боли и страданий

Технологический журнал Абонемент ($m)

Технологический журнал - мощный инструмент логирования, используемый для анализа проблем производительности 1С. Но он обладает одним огромным недостатком, в "сыром виде" он почти не поддается адекватному анализу из-за своей структуры. Существует довольно много способов "разобрать" технологический журнал, но все опробованные способы обладают теми или иными недостатками. Предлагаю вам мой вариант "велосипеда" для разбора ТЖ и хранения разобранного в различных форматах.

1 стартмани

12.12.2022    5254    28    Segate    24    

75

Правила работы с транзакциями 1С

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Список правил при работе с транзакциями из BSL Language Server и SonarQube 1C (BSL) Plugin. Переработка и осмысление материала.

01.12.2022    4889    kuzyara    42    

78

Утилита тестирования сервера 1С от HADGEHOGs

HighLoad оптимизация Мониторинг Платформа 1С v8.3 Россия Бесплатно (free)

Программа для тестирования вашей инфраструктуры 1С. Анализ ключевых параметров оборудования и ПО серверов 1С и MS SQL, поиск ошибок в базах 1С на стороне MS SQL, тестирование производительности серверов MS SQL и 1С, обмен результатами замеров с сообществом, построение отчета.

21.09.2022    13414    1022    Hadgehogs    56    

132

Быстрый фронт в базе размером 6.8 терабайт – наши стандарты при разработке и рефакторинге запросов

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

От быстродействия запросов, которые обращаются к крупным таблицам, напрямую зависит скорость работы всей базы в целом. Артем Кузнецов, тимлид команды 1С в компании ООО «Финтех решения» на конференции Infostart Event 2021 Moscow Premiere рассказал, как оптимизировать производительность при поддержке больших систем. Показал, на что следует обращать внимание при код-ревью запросов, как оптимизировать RLS, виртуальные таблицы, индексы и условия, и как доработка архитектуры решения может ускорить работу базы.

29.08.2022    6453    Chernazem    44    

109

Ускорим проведение в 1С:Управление холдингом

HighLoad оптимизация Запросы Платформа 1С v8.3 1С:Управление холдингом Бесплатно (free)

В 1С:Управление холдингом есть "нехороший" запрос, который съедает значительную часть времени проведения документов. Если его подправить, то проведение заметно ускорится.

10.08.2022    5363    sapervodichka    64    

74

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье хотим рассказать об одном нашем непростом расследовании, в котором удалось собрать сразу несколько проблем на разных уровнях инфраструктуры заказчика и изначальной методологии ведения учета. Само расследование в какой-то момент стало напоминать детективную историю, с роялями в кустах, ошибками платформы, странным поведением пользователей и магическим поведением хорошо знакомых механизмов. Но мы реалисты, поэтому все проблемы были выявлены и устранены ;)

11.07.2022    5826    it-expertise    27    

57

10 «заповедей» эксплуатации крупной информационной системы 1С

Управление ИТ-подразделением Внедрение ИТ-системы HighLoad оптимизация Бесплатно (free)

Крупные системы 1С давно уже перешагнули и десятки терабайт, и тысячи пользователей, но во многих случаях подход к эксплуатации таких систем остаётся не на должном уровне. Антон Дорошкевич на конференции Infostart Event 2021 Post-Apocalypse поделился более чем 10-ти летним опытом эксплуатации подобных систем, сведя его к 10 «заповедям», соблюдение которых сделает 1С надёжнее, а труд разработчика – благодарнее и благороднее.

11.07.2022    7973    a.doroshkevich    33    

86

Производительный режим работы RLS

HighLoad оптимизация Роли и права Платформа 1С v8.3 8.3.14 8.3.6 8.3.8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Бесплатно (free)

Функционал подсистемы УправлениеДоступом позволяет работать с RLS в двух режимах: стандартном и производительном. Каждый из режимов имеет свои преимущества и недостатки относительно другого. Основные из них будут рассмотрены в данном материале.

14.06.2022    9402    Neti    7    

97

Красота разработки в 1С, или художественная верстка кода

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рекомендации по верстке и организации кода в 1С, которые я вывел для себя. P.S. Нет, это не про комментарии и номера версий.

02.06.2022    7647    TimofeySin    67    

65

Мастер-класс SonarQube. В омут с головой

Рефакторинг и качество кода Бесплатно (free)

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

19.05.2022    11601    nixel    84    

132

Как выжить, если у тебя в базе 1С 50+ расширений

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Расширения – это простой способ делать доработки на лету. Но администрировать большое количество расширений и не допустить бардак – очень сложно. О том, как выжить в такой ситуации, реализовать управление доработками и установкой актуальных версий расширений, на митапе «Путь к идеальному коду» рассказал Юрий Былинкин – архитектор 1С в компании Аскона.

16.05.2022    6156    ardn    44    

56

Несколько слов про платформенный механизм оптимизации RLS

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Смотрим, как работает платформенный механизм оптимизации RLS, сравним поведение на разных СУБД MS SQL, Postgres 11,13,14.

07.04.2022    3901    ivanov660    23    

69

Экспертный кейс. Расследование фатального замедления времени расчета себестоимости в 1С:ERP 2

HighLoad оптимизация Механизмы типовых конфигураций Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

При выполнении нагрузочного тестирования информационной системы на базе 1С:ERP для одного из клиентов с целью оценки возможности миграции системы на PostgreSQL и Astra Linux мы столкнулись с неприемлемым увеличением времени выполнения расчета себестоимости. Строго говоря, сценарий тестирования закрытия месяца не был выполнен вообще – он не укладывался в таймаут выполнения теста, 24 часа. По прошествии 18 часов всё ещё шло выполнение операции «Распределение затрат и расчет себестоимости». Более 16 часов выполнялся подэтап “Расчет партий и себестоимости. Этап. Расчет себестоимости: РассчитатьСтоимость”. Всё это время выполнялся запрос, который в текущей инфраструктуре клиента (СУБД MS SQL Server) выполняется чуть более 3 минут на аналогичных данных.

25.03.2022    5923    it-expertise    92    

68

Пример пошагового решения проблемы производительности на базе Postgres SQL с картинками

HighLoad оптимизация Технологический журнал Платформа 1С v8.3 Бесплатно (free)

Рассмотрим по шагам процесс обнаружения, анализа и решения проблемы производительности на примере базы ERP, сравним отличия в работе Postgres и MS SQL.

28.02.2022    13699    ivanov660    18    

147

Привилегированные отчеты

Роли и права HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение позволяет настроить для пользователей выполнение отчетов в привилегированном режиме. 1) Убирает тормоза формирования отчета, возникающие при наложении прав пользователя на запросы отчета; 2) Позволяет обойти ошибки формирования отчета из-за отсутствия прав на часть объектов у пользователя.

4 стартмани

24.01.2022    11311    27    sapervodichka    36    

102

Про простой и понятный код

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Внимание! Данная публикация с большой долей вероятности не добавит ничего нового к Вашим знаниям и Вашему опыту, поэтому если Вы читаете Инфостарт исключительно для целей "прокачки" своих навыков, не тратьте на её чтение своё время и перейдите сразу к следующей!

03.12.2021    5523    q_i    161    

71

Стек технологий для 1С

Инструментарий разработчика Рефакторинг и качество кода Групповая разработка (Git, хранилище) Механизмы платформы 1С Бесплатно (free)

Стек технологий, которые могут быть полезны разработчику на 1С и около 1С. По каждой технологии постарался объяснить, зачем она нужна и с чего начать изучение, если заинтересует.

29.11.2021    32552    mrXoxot    63    

429

Изыскания на тему записи в регистр сведений

HighLoad оптимизация Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Абонемент ($m)

Уважаемые коллеги, здравствуйте! Сегодня хочу поделиться с Вами своими изысканиями на тему записи в регистр сведений в контексте оптимизации одной операции. Однажды мы столкнулись со следующей проблемой: поступили жалобы от разработчиков сайта, что наш веб-сервис очень медленно реагирует, точней, обработка запроса не укладывается в таймаут 5 секунд, и сайт получает ошибку 500. Стали разбираться, и вот что выяснили.

1 стартмани

21.09.2021    14100    0    METAL    57    

104

Как читать чужой код? Часть 1. Общие вопросы. Доработка чужого кода. Code review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    13339    biimmap    55    

139

Адекватный параллелизм в 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Параллелизм ускоряет выполнение тяжелых регламентных операций на СУБД, но может негативно влиять на работу многопользовательских учетных систем. О том, как анализировать влияние параллелизма и настраивать его для MS SQL и PostgreSQL, рассказал ведущий разработчик компании ООО МКК «Ваш Инвестор» Вадим Фоминых.

13.08.2021    15577    Shmell    8    

59

Распространенные ошибки разработчиков, приводящие к проблемам производительности

HighLoad оптимизация Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Рассмотрим примеры ошибок, анализ, исправление и мероприятия по недопущению подобного в будущем. Всего будет 18 примеров.

02.08.2021    16600    ivanov660    77    

142

Антипаттерны программирования в 1С

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поговорим про плохой стиль программирования и рассмотрим 17 часто встречающихся антипаттернов.

19.07.2021    13124    ivanov660    121    

69

Powershell: Анализ технологического журнала. Топ-25 вызовов.

Технологический журнал Платформа 1С v8.3 Абонемент ($m)

Использование Powershell для анализа технологического журнала 1с. Пример получения топ-25 вызовов

1 стартмани

16.06.2021    8714    7    Dimashiro    17    

54

Автоматизация расчета покрытия кода тестами

Рефакторинг и качество кода Бесплатно (free)

На Infostart Meetup, посвященном DevOps-технологиям, с докладом о том, как автоматизировать расчет покрытия кода, выступил программист компании 42Clouds Станислав Косолапов. Станислав рассказал об инструменте собственной разработки для таких задач и показал работу решения на практике.

21.05.2021    6688    amoarok    14    

67

Чек-листы для проведения Code Review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

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

17.05.2021    11703    Shining_ninja    99    

129

Поиск причин блокировок СУБД

HighLoad оптимизация Платформа 1С v8.3 Управление блокировками Конфигурации 1cv8 Бесплатно (free)

Расследование блокировок СУБД. Статья написана по мотивам вебинара Виктора Богачева.

28.04.2021    8534    vasilev2015    14    

84

Как контролировать качество внешних обработок, отчетов, правил обмена, расширений 1С и поставить это на поток

Рефакторинг и качество кода Бесплатно (free)

Если код написан качественно, его легче развивать и дешевле поддерживать. О том, как организовать контроль качества кода в ручном и автоматическом режиме, и какие инструменты могут в этом помочь, на INFOSTART MEETUP Новосибирск.Online рассказал Олег Тымко.

09.04.2021    8804    olegtymko    26    

112

Как быстро развернуть автоматическую линию проверки своего решения на 1С, затратив 8 часов и получив выигрыш в 1 человеко/месяц

Рефакторинг и качество кода Бесплатно (free)

У разработчиков 1С уже есть все инструменты, позволяющие использовать современные инженерные практики в 1С. О том, как за 8 часов внедрить автоматические проверки для решений на 1С, снизить в них количество глупых ошибок, а также высвободить ресурсы на более интеллектуальную работу на INFOSTART MEETUP Ekaterinburg.Online рассказал Артур Аюханов.

05.04.2021    8868    artbear    16    

111

Решение нестандартных проблем производительности на реальных примерах

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

На екатеринбургском Infostart Meetup выступил с докладом архитектор ИС центра разработки ФТО Александр Криулин. Он поделился с коллегами кейсами нестандартных проблем производительности и рассказал о способах их решения.

24.03.2021    8176    AlexKriulin    37    

78

Рецепты приготовления технологического журнала

Технологический журнал Бесплатно (free)

Понимание принципов событий технологического журнала позволяет решать многие проблемы производительности и стабильности работы платформы 1С. О том, как взаимосвязаны события технологического журнала и как с их помощью можно анализировать серверные вызовы 1С, на INFOSTART MEETUP Ekaterinburg.Online рассказал программист 1С из компании ДНС-Ритейл Максим Старков.

22.03.2021    24256    max_st    9    

171

Соединение вложенными циклами

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Nested loops и отсутствующие индексы. Статья написана по мотивам вебинара Виктора Богачева.

12.03.2021    5302    vasilev2015    22    

61

Водопад из Техжурнала 1С

Технологический журнал Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Строим визуализацию в виде waterfall-графика по данным событий технологического журнала.

5 стартмани

23.12.2020    6519    VKislitsin    5    

91

Практика применения DevOps. Работа с SonarQube

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во второй части мастер-класса «Практика применения DevOps» на конференции Infostart Event 2019 Inception выступил Виталий Подымников – он рассказал про процесс проверки качества кода и использование SonarQube для работы с ним.

07.12.2020    16491    arcius_7012    21    

84