При росте объема базы данных и количества активных пользователей многие разработчики и администраторы сталкиваются с проблемами производительности: отчеты финансового отдела или партии товаров начинают выполняться по 30–40 минут. Возникает естественное желание использовать прямые запросы к MS SQL Server в обход платформы 1С. Разберем подробнее, почему этот подход в платформе 1С 8 является ошибочным и как правильно решать задачи ускорения работы базы средствами самого языка 1С и СУБД.
В отличие от версии 1С 7.7, где платформа работала с СУБД через механизмы курсоров и использование прямых запросов (например, через ВК 1С++) давало колоссальный прирост скорости, в 1С 8 архитектура взаимодействия с базой данных кардинально изменилась.
Встроенный язык запросов 1С v8 уже является декларативным языком высокого уровня, который транслируется самой платформой напрямую в оптимальные SQL-запросы к СУБД (MS SQL Server, PostgreSQL и др.). Попытка писать прямые запросы к СУБД в 1С 8 влечет за собой серьезные риски и проблемы:
Чтобы понять, как написанный запрос 1С преобразуется в физический SQL-запрос, и проанализировать план его выполнения, используем специализированные инструменты:
DBMSSQL можно записывать все выполняемые к СУБД запросы и время их выполнения.Проанализируем основные причины медленной работы отчетов и способы их исправления без использования прямых SQL-запросов.
1. Использование параметров виртуальных таблиц
Одной из главных ошибок является наложение условий на данные в секции ГДЕ вместо передачи параметров непосредственно в параметры виртуальных таблиц регистров. Если отбор указан в секции ГДЕ, СУБД вынуждена сначала выгрузить всю таблицу остатков или оборотов и только потом фильтровать ее, что приводит к сканированию всей таблицы на диске.
2. Исключение обращений «через точку»
Обращение в запросе к реквизитам через несколько ссылок (например, Регистратор.Контрагент.ОсновнойДоговор) заставляет платформу формировать множественные неявные соединения (LEFT JOIN) в SQL-запросе. Разберем по шагам правильный подход: такие обращения следует заменять явными соединениями с нужными справочниками или документами через временные таблицы.
3. Использование и индексация временных таблиц
При объединении больших объемов данных необходимо разбивать сложный запрос на несколько простых этапов с помещением промежуточных результатов во временные таблицы. Для полей, по которым в дальнейшем выполняется соединение или выборка по условию ГДЕ, обязательно нужно указывать инструкцию ИНДЕКСИРОВАТЬ ПО.
Рассмотрим пример индексации временной таблицы в запросе 1С:
ВЫБРАТЬ
Партии.Номенклатура КАК Номенклатура,
Партии.Серия КАК Серия,
СУММА(Партии.КоличествоОстаток) КАК КоличествоОстаток
ПОМЕСТИТЬ ВремОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Партии
СГРУППИРОВАТЬ ПО
Партии.Номенклатура,
Партии.Серия
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Серия;
4. Оптимизация поиска в объекте ТаблицаЗначений
Если алгоритм обработки данных выполняет поиск с помощью метода Найти() или НайтиСтроки() по объекту ТаблицаЗначений с большим количеством строк, необходимо предварительно проиндексировать соответствующие колонки. Без индексации платформе приходится выполнять последовательный перебор всех строк.
Пример добавления индексов в таблицу значений:
// Добавляем индекс по полю поиска для ускорения работы метода Найти
ТЗТовары.Индексы.Добавить("Номенклатура");
ТЗТовары.Индексы.Добавить("Характеристика");
// Теперь поиск по проиндексированным колонкам выполняется за время O(1)
НайденнаяСтрока = ТЗТовары.Найти(ИскомаяНоменклатура, "Номенклатура");
Если структуры запросов написаны корректно, но база данных продолжает тупить с ростом объема, причина чаще всего кроется в отсутствии обслуживания MS SQL Server:
Max Degree of Parallelism (MAXDOP) предотвращает взаимные блокировки и перегрузку процессоров при выполнении тяжелых отчетов параллельно с оперативной работой пользователей.Для детального изучения механизмов взаимодействия 1С с СУБД и оптимизации производительности рекомендуется изучить книгу «1С:Предприятие 8. Настольная книга по оптимизации проводимости и производительности», а также методические статьи на ресурсе 1С:ИТС по устройству таблиц и индексов платформы.