При работе с большим объемом данных в конфигурации 1С:Управление нашей фирмой часто возникает проблема замедления запросов к табличным частям, в частности, при поиске элементов справочника ХарактеристикиНоменклатуры по их дополнительным реквизитам. Разберем по шагам, почему это происходит и как мы можем исправить ситуацию, повысив производительность системы в разы.
Когда мы выполняем поиск по табличной части ДополнительныеРеквизиты, мы используем запрос к полям Свойство и Значение. В стандартной поставке эти поля могут быть не проиндексированы. В результате при увеличении количества записей в базе данных SQL-сервер вынужден выполнять полное сканирование таблицы (Table Scan), что требует значительных ресурсов и времени.
Важно понимать, что поле Значение часто имеет составной тип данных. В SQL-структуре 1С это приводит к тому, что одно поле превращается в набор технических колонок. Индексация таких полей может быть неэффективной или даже вредной, так как платформа создаст множество индексов для каждого типа данных, что приведет к перегрузке базы данных лишними структурами.
Наиболее эффективным и безопасным первым шагом является индексация колонки Свойство. Так как это поле обычно имеет ссылочный тип (ссылка на ПланВидовХарактеристик), оно обладает высокой селективностью.
ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.Свойство установите признак Индексировать в значение Индексировать.Результаты такой оптимизации могут быть впечатляющими: как показывает практика, прирост скорости поиска может достигать 20 и более раз. Это происходит потому, что SQL-оптимизатор сразу отсекает подавляющее большинство строк, не соответствующих выбранному свойству, и поиск по оставшемуся набору происходит мгновенно.
Мы проанализировали ситуацию с индексацией поля Значение. В отличие от Свойства, индексация Значения часто не приносит желаемого результата из-за составного типа данных. Не рекомендуется массово индексировать такие поля без острой необходимости, так как это может привести к созданию лишних индексов в SQL, что негативно скажется на скорости записи данных (вставки и обновления характеристик).
Если вы все же решите экспериментировать, всегда проверяйте план выполнения запроса. Если SQL-сервер выбирает неоптимальный план (например, индекс вместо поиска по фильтру), от индексации стоит отказаться.
Если проект требует работы с огромным массивом характеристик, и стандартных средств индексации табличной части недостаточно, рассмотрим создание отдельного РегистраСведений. Этот подход позволяет полностью контролировать индексы.
Разберем структуру такого регистра:
Характеристика (Тип: СправочникСсылка.ХарактеристикиНоменклатуры).Свойство (Тип: ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения).Значение (Тип: Характеристика.ДополнительныеРеквизитыИСведения).Такое решение позволяет индексировать комбинацию измерений Свойство и Значение в самом регистре, что дает максимально возможную производительность при поиске. Перенос данных в регистр осуществляется через механизм подписки на событие ПриЗаписи справочника ХарактеристикиНоменклатуры.
// Пример логики заполнения регистра при записи характеристики
Процедура ПриЗаписиХарактеристики(Источник, Отказ) Экспорт
НаборЗаписей = РегистрыСведений.ЗначенияДопРеквизитовХарактеристик.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Характеристика.Установить(Источник.Ссылка);
Для Каждого СтрокаТЧ Из Источник.ДополнительныеРеквизиты Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Характеристика = Источник.Ссылка;
НоваяЗапись.Свойство = СтрокаТЧ.Свойство;
НоваяЗапись.Значение = СтрокаТЧ.Значение;
КонецЦикла;
НаборЗаписей.Записать();
КонецПроцедуры
Мы выяснили, что для решения задачи ускорения поиска необходимо действовать последовательно:
Свойство в табличной части справочника — это даст максимальный эффект при минимальных затратах ресурсов.Значение) без предварительного тестирования производительности.РегистрыСведений, где структура индексов полностью подконтрольна разработчику.Помните, что лучший способ проверки любого изменения — это сравнение плана выполнения запроса в SQL Server Management Studio до и после внесения правок. Удачи в оптимизации!