Одна из причин медленной работы табеля (ЗУП 2.5, клиент-сервер, MS SQL Server)

22.06.16

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

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

Началось все с того, что я решил проанализировать рабочий MS SQL-сервер на предмет избыточных и недостающих индексов в базах 1С (навеяно статьей "Для чего НЕ нужны индексы").

Для анализа использовал запросы-шаблоны из этой статьи SQL Server: Базы данных и индексы.

"Прогнал" на одной из самых больших баз ЗУП запрос "Missing Indexes in current database by Index Advantage":

 Запрос анализа недостающих индексов SQL

Получилась вот такая интересная картинка:

Результат запроса


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

Судя по last_user_seek, проблема актуальна - запрос к данной таблице выполнялся всего несколько минут назад (анализ индексов выполнялся в 12:00 18.01.2016). А судя по значениям unique_compiles и user_seeks, отбор по колонкам из equality_columns данной таблицы выполняется довольно часто.

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

Структура БД

 

Выяснилось, что это регистр "Графики работы по видам времени". Поля_Fld2990, _Fld6561 и _Fld2988Rref, по которым требуется создать недостающий индекс (equality_columns), соответствуют измерениям регистра Месяц, План и ВидУчетаВремени. Проверим, существует ли индекс, удовлетворяющий такому набору полей:

Индексы регистра

 

В существующем индексе по измерениям регистра ByDims, все необходимые для требуемого индекса поля присутствуют, но проблема в порядке полей - они идут после поля ГрафикРаботы, которое в данном случае по каким-то причинам не используется, и данный индекс задействован быть не может. Остальные индексы также не удовлетворяют условиям.

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

Необходимо найти в конфигурации ЗУП запрос, выполняющий отбор по колонкам Месяц + План + ВидУчетаВремени регистра "Графики работы по видам времени" без отбора по полю ГрафикРаботы. Для этого я использовал глобальный поиск по конфигурации (искал по тексту "РегистрСведений.ГрафикиРаботыПоВидамВремени"). Для сужения области поиска учитывал информацию из колонки included_columns, в которой перечисляются получаемые в искомом запросе поля. 

Наиболее вероятный кандидат на проблемный запрос был обнаружен в модуле формы документа "Табель учета рабочего времени", в функции ПолучитьНормуВремениПоДню, вызываемой при вводе в ячейку табеля:

Запрос до оптимизации

В нем есть все искомые поля и отборы. Но есть проблема - в запросе явно используется отбор по полю ГрафикРаботы, которого по условиям нашего поиска быть как раз не должно. Очевидно, что здесь должен быть задействован уже существующий индекс по всем измерениям. Зачем тут нужен какой-то другой индекс и почему все-таки был выбран именно этот запрос?

Я остановил свое внимание на этом запросе только потому, что отбор по ГрафикРаботы здесь организован через ГДЕ ... В (ВЫБРАТЬ ... ИЗ ...). Ранее я уже неоднократно сталкивался с тем, что при таком написании условий отбора оптимизатор SQL срабатывает некорректно и не использует уже имеющиеся индексы (см. Ускоряем заполнение документа "Формирование записей книги покупок"). К тому же, именно на табель, а, точнее, на его интерактивную часть, указывали некоторые косвенные признаки, специфические для организации, в которой ведется учет.

Замер времени выполнения данного запроса показал длительность ~1,5 сек., что очень существенно для функции, срабатывающей при вводе в ячейку табеля. Это косвенно подтверждает, что найден тот самый проблемный запрос.

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

Итак, проверим мое предположение о некорректной отработке условия "ГДЕ ... В ()". Перепишем запрос на более предсказуемое внутреннее соединение:

 Запрос после оптимизации

 

Замер оптимизированной версии запроса показал ~0.08 секунд, то есть время выполнения уменьшилось почти в 20 раз.

В идеале, конечно, для подтверждения моих догадок, надо было заглянуть в исходный и результирующих план запроса через Profiler, но, уж простите, поленился. Данная "особенность" отработки "ГДЕ ... В (...)" на MS SQL уже набила оскомину и я был на 99,99% уверен, что увидел бы там какой-нибудь медленный Index Scan, который после оптимизации превратился бы в быстрый Index Seek. Я просто подождал один день после исправления проблемного запроса и снова выполнил анализ индексов - проблема, как я и ожидал, стала неактуальной.

В результате данной оптимизации работа с табелем стала гораздо комфортнее. Какой будет эффект на Вашей базе и будет ли он вообще, сказать сложно. Но если этот участок учета критичен в Вашей организации и по нему есть нарекания от пользователей по части производительности, то попробовать применить данную практику все-таки стоит.

ЗУП 2.5.97.1 (8.2.19.83), SQL Server 2005 (9.00.4053.00, 64-bit)


См. также:

Оптимизированная версия Т-13

табель оптимизация производительность скорость SQL интерфейс ЗУП 8.2 план запросов тормозит

См. также

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

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

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

13.03.2024    3550    spyke    28    

47

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

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

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

13.03.2024    5500    vasilev2015    19    

38

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

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

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

1 стартмани

15.02.2024    8178    167    ZAOSTG    71    

101

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

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

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

09.01.2024    6479    doom2good    48    

64

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

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

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

20.11.2023    9306    ivanov660    6    

76

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

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

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

15.11.2023    5319    a.doroshkevich    20    

72

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

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

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

11.10.2023    16544    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. chmv 19.01.16 11:36 Сейчас в теме
Спасибо. Табель на 100 человек проводится довольно долго, а если достигает 3000-4000 то очень долго. Сейчас быстрее. Насчет правильности пока не знаю
2. KAPACEB.AA 459 19.01.16 12:10 Сейчас в теме
(1) chmv,
Затронутая в статье проблема к проведению табеля отношения не имеет. Доработка потенциально устраняет только интерфейсные "тормоза" при работе с ячейками табеля.
xantif_2000; Adilgeriy; chmv; echo77; +4 Ответить
3. 31337 39 19.01.16 16:51 Сейчас в теме
Спасибо, очень ясно описал и решение не сложное.
4. Pim 180 19.01.16 18:47 Сейчас в теме
1. Такой вариант оптимизации работает только для MS SQL или в остальных случаях тоже помогает?
2. Не быстрее будет вместо внутреннего соединения получить массив сотрудников (отдельным запросом), а уже затем использовать этот массив в качестве параметра в секции ГДЕ (на файловых базах в подобных случаях помогало).
5. KAPACEB.AA 459 19.01.16 21:00 Сейчас в теме
(4) Pim,
1. В остальных случаях не проверял )
2. Возможно сработает предложенный вариант, не пробовал. По моему опыту, соединение даёт более предсказуемый результат.
9. hornet_X 1 22.01.16 08:29 Сейчас в теме
(5) Оптимизация прошла успешно SQL Server 10.50.6220.0 ОС 6.1.7601. Спасибо за статью)
7. ixijixi 1794 20.01.16 14:04 Сейчас в теме
(4) Pim, скорее всего прироста не будет, т.к. будет использоваться тот же оператор В(&МассивСотрудников)
6. rasswet 82 20.01.16 07:40 Сейчас в теме
спасибо, очень подробно и ясно написано. Приятно читать!
8. bulas 212 20.01.16 14:36 Сейчас в теме
Время формирования Табеля уменьшилось (на количество строк по сотрудникам - 2300), так что прием действенный.
10. soulsteps 73 22.01.16 10:17 Сейчас в теме
Почему не вынесли подзапрос во временную таблицу с последующим индексированием поля "График работы", следующим же пакетом получали оставшиеся данные. Интересно, как бы изменилось время выполнения...
11. KAPACEB.AA 459 22.01.16 10:21 Сейчас в теме
(10) soulsteps,
Пробовал, на скорость не повлияло. В данном случае гораздо важнее задействовать индекс по физической таблице. Создание и индексирование временной таблицы, вероятно, добавит только дополнительные издержки. Хотя для надежности работы запроса, возможно, стоит сделать именно так, как Вы предложили.
12. kovgard 148 15.02.16 18:08 Сейчас в теме
Хорошая аналитическая работа. Проверил на файловой версии БД - реальное ускорение. Спасибо!
dj_serega; +1 Ответить
13. KAPACEB.AA 459 16.02.16 10:09 Сейчас в теме
(12) kovgard,
Спасибо за обратную связь.
Интересно, что на файловой сработало - честно говоря, были сомнения.
14. chmv 22.06.16 11:05 Сейчас в теме
А ПРИ ПРОВЕДЕНИИ КАК УСКОРИТЬ?
15. KAPACEB.AA 459 22.06.16 16:08 Сейчас в теме
(14) chmv,
До проведения пока руки не дошли.
Зато на днях удалось оптимизировать Т-13 (см. http://infostart.ru/public/532649/)
16. PerlAmutor 129 28.10.20 20:12 Сейчас в теме
Тут проблема не совсем в "В()", в запросе идет объединение с разными типами данных (ГрафикРаботы и Сотрудник). Если оставить только первый или только второй подзапрос, то уверен на 99%, что весь запрос будет выполняться быстро. В то же время, как выше предложили, если вынести сначала все в Массив, то тоже прироста не увидите, т.к. в нем тоже будут элементы разных типов. Но стоит оставить в этом массиве лишь элементы одного типа - запрос опять начнет выполняться быстро.
triviumfan; +1 Ответить
17. triviumfan 93 14.06.21 14:06 Сейчас в теме
Без разбора плана запроса статья - "пшык".
18. KAPACEB.AA 459 14.06.21 14:47 Сейчас в теме
(17) Да, согласен, с планом запроса было бы интереснее)
p.s. Удивительно в 2020 году получать комментарии к такой древней и не совсем актуальной статье :)
19. triviumfan 93 14.06.21 14:50 Сейчас в теме
(18) чего же удивительного?! Это же инфостарт. В середине 21 года на заглавной странице показывать рекомендации из 2016.
Оставьте свое сообщение