Как повлияет включение индексации по серии номенклатуры на производительность регистров в 1С:УПП?

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При оптимизации высоконагруженных баз данных на платформе 1С:Предприятие (в частности, конфигурации «Управление производственным предприятием 1.3») часто возникает вопрос включения индексации по дополнительным измерениям регистров накопления, таким как ТоварыНаСкладах и СвободныеОстатки. Рассмотрим подробнее, как индексы СУБД влияют на скорость работы системы и стоит ли включать индексирование по измерению СерияНоменклатуры.

Баланс между скоростью чтения и записью данных

При решении задач производительности важно помнить фундаментальное правило работы индексов в СУБД:

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

Проанализируем ситуацию: если основной проблемой системы является долгая запись наборов записей при проведении документов (например, вызов процедуры ЗаписатьНаборЗаписейНаСервере занимает много времени), то добавление новых индексов лишь ухудшит показатели производительности при проведении.

Нужен ли отдельный индекс по полю СерияНоменклатуры?

Разберем архитектуру хранения данных в 1С. Справочник СерииНоменклатуры имеет обязательного владельца — элемент справочника Номенклатура. Это означает, что любое конкретное значение серии жестко привязано к своей номенклатуре.

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


Номенклатура = &Номенклатура
И СерияНоменклатуры = &Серия

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

Включение индексирования для СерияНоменклатуры имеет смысл только тогда, когда в системе выполняются массовые запросы с отбором исключительно по серии, без указания номенклатуры-владельца. В реальных учетных сценариях 1С:УПП такие запросы встречаются крайне редко.

Как ускорить работу с регистрами остатков без создания лишних индексов?

Выясним причину медленной работы и рассмотрим практические шаги по оптимизации:

  1. Профилирование нагрузки: Прежде чем менять структуру индексов в конфигураторе, необходимо собрать трассировку вызовов и проанализировать узкие места с помощью замера производительности или ЦУП (Центра управления производительностью).
  2. Порядок измерений в конфигураторе: Порядок измерений в ветке конфигуратора напрямую определяет порядок полей в кластерном индексе таблицы итогов СУБД. Наиболее часто используемые в отборах аналитики (Номенклатура, Склад) должны располагаться в самом верху списка измерений регистра.
  3. Оптимизация текста запросов: Перепишите запросы к виртуальным таблицам остатков так, чтобы в отборах всегда передавалась Номенклатура, полученная из серии (СерияНоменклатуры.Владелец). Это позволит СУБД использовать стандартный индекс без сканирования всей таблицы.
  4. Обслуживание СУБД: При активной записи документов происходит фрагментация индексов. Настройте регулярное выполнение регламентных процедур обновлений статистики (UPDATE STATISTICS) и реиндексации таблиц регистров, а также установите подходящий коэффициент заполнения страниц (FILLFACTOR).
  5. Сворачивание сплит-записи при разделении итогов: Если в регистре включено разделение итогов, периодически запускайте процедуру сжатия итогов, чтобы избавиться от разросшихся технический записей с разделителями.
← На главную