Простой способ определения узких мест конфигурации

24.01.22

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

В силу различных причин, информационная база 1С с которой работают законописатели, 3 программиста и около 200 пользователей, начала "тормозить". Изучив в интернете возможности различных способов поиска путей оптимизации, я изобрел собственный "велосипед", назвав его "методом идентификации запросов". Основное назначение метода, это поиск неоптимальных запросов к MS SQL. Приложив немного усилий по модификации кода, мы получили инструмент позволяющий в любой момент ответить на вопрос: "что и когда тормозит?"

Скачать файлы

Наименование Файл Версия Размер
Обработка создания текстовых идентификаторов в запросах
.epf 9,08Kb
52
.epf 9,08Kb 52 Скачать

Суть проста: в каждый запрос 1С добавляем текстовое поле с идентификатором. Можно использовать строкового (например, КодИБ_ИдЗапроса) или для уменьшения объема генерируемых данных использовать числовые идентификаторы (необходимо иметь таблицу соответствий: код – описание запроса). Запрос с идентификатором будем называть помеченным запросом. Для удобства мониторинга, желательно идентификатор делать первым полем в запросе. При оптимизации «тяжелого» запроса рекомендую изменять идентификатор.

Это просто пример,

                З = Новый Запрос("ВЫБРАТЬ

                                 |            ""ЭтоНашИдентификаторЗапроса_версии1"" КАК Поле1,

                                 |            Номенклатура.Ссылка

                                 |ИЗ

                                 |            Справочник.Номенклатура КАК Номенклатура

                                 |ГДЕ

                                 |            Номенклатура.Наименование = &Наименование") ;

Теперь мы можем «родными» средствами статистики MS SQL проводить анализ и мониторинг постоянно в реальном времени, причем комплексно – сразу по всем базам на сервере. На рисунке ниже выделен запрос до (_2) и после оптимизации(_4).

 

Сам я использую свою обработку //infostart.ru/public/145342/, в которой вы можете найти отчет «Нагрузка на сервере БД» который сообщит, вам какие запросы нагружали сервер больше всего за последний час работы. Период можно изменить в макете «НагружающиеЗапросы»: set @hours = 1; .

            avg_elapsed – среднее время на выполнение плана запроса

            total_elapsed_time – общее время затраченное на выполнение плана

            exec_count – количество выполнений плана

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

Для автоматизации идентификации запросов можете исппользовать обработку (черновой вариант):

  1. выгружаем файлы конфигурации в каталог
  2. запускаем обработку, указываем в ней каталог куда выгрузили, жмем загрузить и выполнить
  3. двойной клик мыши на записи отображает сравнение файлов 
  4. загружаем файлы конфигурации, корректируем

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

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

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    2969    spyke    26    

42

Быстродействие типовой 1С

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

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5103    vasilev2015    19    

37

Анализируем SQL сервер глазами 1С-ника

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

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7629    158    ZAOSTG    67    

96

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

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

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    5973    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8859    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5097    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16168    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1448 12.12.12 01:46 Сейчас в теме
Где картинки? не видно.
2. DrAku1a 1679 12.12.12 02:22 Сейчас в теме
Сам я использую свою обработку http://infostart.ru/profile/110475/public/

Ссылка на список Ваших публикаций...

Эта обработка: http://infostart.ru/public/145342/?
3. serega3333 12.12.12 09:39 Сейчас в теме
Вопщем все запросы надо перелопатить в итоге вручную, т.е. добавить эти идентификаторы? Автоматом никак нельзя это сделать?
4. AHDP 8 12.12.12 10:40 Сейчас в теме
(3) serega3333,

В 8.3 штатно разложить на составляющие тексты их программно модифицировать и собрать обратно.
Только не забыть про временные таблицы в запросах.
serega3333; +1 Ответить
5. serega3333 12.12.12 10:48 Сейчас в теме
(4) а новая эта фишка в 8.3, понял, спасибо!
6. m191 122 12.12.12 11:03 Сейчас в теме
(3) serega3333,
Сейчас пытаюсь создать инструмент для автоматизации этой задачи. Идеи и предложения очень приветствуются.

Идея для всех версий платформы:
1 Сохраняем конфигурацию в файл, ее будем далее использовать для обновления и поддержки
2 В конфигураторе выгружаем модули
3 Обработкой помечаем запросы
4 Загружаем модули
5 Обновляем конфигурацию базы
6 Мониторим и оптимизируем
7 Все лучшие наработки переносим в сохраненную конфу
8. AHDP 8 12.12.12 11:30 Сейчас в теме
(6)
Предлагаю три режима:
1) весь пакет метить одной меткой с последующим суммированием времен выполнения;
2) каждый самостоятельный запрос отдельно;
3) каждый подзапрос и каждую часть запроса в "объеденить".

Делаешь через ТекстЗапроса = Заменить(ТекстЗапроса,,) или через непосредственное редактирование текста?
14. m191 122 12.12.12 14:10 Сейчас в теме
(8) AHDP,
>Делаешь через ТекстЗапроса = Заменить(ТекстЗапроса,,) или через непосредственное редактирование текста?
Мы пока все вручную. Помечаем только запросы которые мы изменяем или создаем,
в дефолтные запросы от поставщиков стараемся не трогать, что бы не создавать себе дополнительных проблем с обновлениями. Про режимы не понял.
7. ksvd 12.12.12 11:26 Сейчас в теме
"Простой способ" не очень уж и простой
9. AHDP 8 12.12.12 11:32 Сейчас в теме
(7) Ага, замер производительности ещё никто не отменял ;)
10. m191 122 12.12.12 11:49 Сейчас в теме
(9) AHDP,
Как вы определите тормоза в высокочастотных запросах на базе с большим количеством пользователей?
Я ни одним инструментом кроме профайлера SQL не смог определить, что базу тормозят именно высокачастотные (вроде быстро работающие, но очень часто вызываемые), а не которые долго выполняются. Методика оптимизации
от 1С с их КИП в данном случае мне кажется бесполезной. Для работы с тех. журналом требуются нехилые ресурсы и навыки.
11. tormozit 7136 12.12.12 12:05 Сейчас в теме
(10) Для работы с техножурналом на самом деле уже немало средств реализовано.

В инструментах разработчика я постарался обеспечить высокий уровень удобства работы с техножурналом. В частности высокочастотные запросы там также можно быстро обнаружить (есть свертки по текстам запросов с вырезанными параметрами и по строкам исходного кода). Также у Гилева есть свой вариант. Также у german есть Enterprise Integrator с профайлером.
12. m191 122 12.12.12 13:45 Сейчас в теме
(11) tormozit,
Да, инструменты есть и не плохие. Однако, у большинства из них по моему мнению, есть один минус - накопление данных. Для примера, я не знаю как эффективно с помощью них круглосуточно выявлять проблеммные запросы в работающей базе с больщим количеством запросов и выявить динамику в течении часа, суток, месяца и т.д.
У всех методов есть плюсы и минусы. Имхо, тех. журнал это не тот инструмент которым можно полноценно мониторить базы.
13. tormozit 7136 12.12.12 14:02 Сейчас в теме
(12) Техножурнал не есть конечный инструмент. Это лишь средство для журналирования важный событий. Имхо только через него и можно универсально мониторить базы, используя конечный инструменты.
15. m191 122 12.12.12 14:38 Сейчас в теме
(13) tormozit,
Вот именно - это журнал событий, а не монитор. Появился он как побочный продукт разработки 1С.
17. gallam99 237 12.12.12 15:22 Сейчас в теме
(12) Есть инструмент PerfExpert от softpoint.ru.
http://www.softpoint.ru/products_id3.htm
Позволяет накапливать данные и возвращаться к проблемному интервалу времени для анализа.
18. пользователь 12.12.12 15:52
Сообщение было скрыто модератором.
...
16. AHDP 8 12.12.12 15:05 Сейчас в теме
(10) Моя позиция такова, что оптимизировать нужно в первую очередь пиковую нагрузку. С запросами которых много и они быстро выполняются проще бороться мастабированием железа - гарантирована стоимость, сроки и результат.
(14) Это я для автоматического добавления в запросы меток. Например в пакете несколько запросов с приемлемым временем исполнения, а сам пакет ну никуда не годиться. Хочется иметь возможность увидеть всё время выполнения пакета и каждого запроса в отдельности.
20. m191 122 13.12.12 17:53 Сейчас в теме
(16) AHDP,
Моя позиция такова, что оптимизировать нужно в первую очередь пиковую нагрузку. С запросами которых много и они быстро выполняются проще бороться мастабированием железа - гарантирована стоимость, сроки и результат.


Не всегда можно это сделать с помощью железа: ограниченый бюджет, сроки ну и достижения предела по ресурсу (например сетевой канал, скорость шины). Иногда лучше и дешевле изменить алгоритм работы.
19. m191 122 13.12.12 17:46 Сейчас в теме
Минус - платная. Сами пользовались? Какие впечатления?

UPD Добавил к статье обработку для выставления идентификаторов.
21. ManyakRus 483 17.12.12 16:13 Сейчас в теме
Activity Monitor выдаёт:

SELECT
@P1
FROM _InfoRg34 T1 WITH(NOLOCK)

Все слова и цифры заменяет на @P1, а как вам удалось сделать чтоб писал по человечески вместо @P1 ?
(SQL SERVER 2008 R2)
22. m191 122 17.12.12 16:32 Сейчас в теме
(21) ManyakRus,
Ничего специально не далали, выдает по умолчанию. Возможо это 1С так делает (у нас 8.1)?
23. ManyakRus 483 18.12.12 10:57 Сейчас в теме
у меня 1C 8.2.16.352,
не получается так :(
24. m191 122 18.12.12 17:14 Сейчас в теме
Проверил, действительно в 8.2 константы передает как параметры - печалька.
Изыскания привели к созданию такого запроса:
	З = Новый Запрос("ВЫБРАТЬ
	                 |	""111"" КАК идзапроса,
	                 |	МАКСИМУМ(""222"") КАК идзапроса1,
	                 |	ВЫБОР
	                 |		КОГДА ИСТИНА
	                 |			ТОГДА ""333""
	                 |		ИНАЧЕ ""444""
	                 |	КОНЕЦ КАК идзапроса2");
:)
Показать


Не знаю как это вяжится со стандартом SQL и как ситуация в других СУБД.
25. ManyakRus 483 19.12.12 10:09 Сейчас в теме
работают оба метода :)
(максимум и выбор)
Расставлю везде метки :)

SELECT
MAX(N'222'),
FROM _InfoRg34 T1 WITH(NOLOCK)

SELECT
CASE WHEN (N'111' = N'222') THEN N'333' ELSE N'444' END
FROM _InfoRg34 T1 WITH(NOLOCK)
26. AnderWonder 27 30.01.13 18:21 Сейчас в теме
Не получается идентифицировать таким образом запрос из СКД, похоже он модифицируется вообще в какой-то непонятный набор с кучей временных таблиц (.
27. ManyakRus 483 30.01.13 19:42 Сейчас в теме
временные таблицы не идентифицируются,
28. ManyakRus 483 30.01.13 19:43 Сейчас в теме
временные таблицы не идентифицируются,
а они тоже много пожирают,
в БД у них видимо команды инсерт вместо селект.
Оставьте свое сообщение