При проектировании структуры регистров накопления в платформе «1С:Предприятие» разработчики часто задаются вопросом: создается ли физический индекс по первому измерению автоматически или для него необходимо явно указывать свойство Индексировать? Разберем подробно, как платформа взаимодействует с реляционными СУБД (например, Microsoft SQL Server), какие индексы генерируются для физических таблиц регистров оборотов и остатков и как это влияет на производительность системы.
Рассмотрим поведение системы на примере регистра накопления с типом вида регистра Обороты. Проанализируем физические таблицы СУБД, которые платформа создает для обеспечения работы данного объекта метаданных.
Для регистра оборотов платформа формирует основную таблицу движений и физическую таблицу оборотов. Экспериментальная проверка и анализ таблиц на стороне СУБД показывают следующее правило:
Индексировать установлено в значение Не индексировать, отдельный физический индекс по данному полю в таблице СУБД не создается.ИЗМЕРЕНИЕ + ПЕРИОД + РЕГИСТРАТОР + НОМЕР СТРОКИ) генерируется в таблицах СУБД только при явном включении свойства Индексировать в конфигураторе.Таким образом, для оборотных регистров накопления утверждение о том, что по первому измерению индекс строится автоматически по умолчанию, является ошибочным. Если снять признак Индексировать у первого измерения оборотного регистра, индекс по этому полю в базе данных SQL будет полностью отсутствовать.
Теперь разберем, как устроена физическая структура регистра накопления с типом Остатки. У данного регистра поведение физических таблиц СУБД существенно отличается из-за наличия таблицы итогов.
В регистрах остатков создаются две ключевые структуры:
ПЕРИОД + ИЗМЕРЕНИЕ 1 + ИЗМЕРЕНИЕ 2 + ... + ИЗМЕРЕНИЕ N. Данный индекс включает в себя все измерения в порядке их следования в дереве метаданных конфигуратора.ИЗМЕРЕНИЕ К) установлено свойство Индексировать, платформа дополнительно формирует отдельный индекс вида ПЕРИОД + ИЗМЕРЕНИЕ К.Посмотрим на это с точки зрения работы СУБД. Поскольку первое измерение уже идет первым в составе автоматического кластерного индекса итоговой таблицы, применение правила левого префикса позволяет СУБД эффективно искать данные по первому измерению без создания отдельного одиночного индекса.
Проанализируем механизм работы составных индексов реляционных СУБД. Составной индекс работает по принципу слева направо (правило левого префикса):
Если условие в запросе накладывает отбор на первое измерение (или группу первых измерений в порядке их задания в метаданных), СУБД выполняет быстрый поиск по существующему составному индексу (операция Index Seek). Отдельный одиночный индекс для первого измерения в этом случае не требуется, а его принудительная установка приводит к дублированию индексных структур на диске.
При проектировании структуры метаданных рекомендуем соблюдать следующие правила относительно порядка измерений:
Индексировать обычно не требуется, так как оно покрывается главным составным индексом итогов.Индексировать.Выясним, к каким последствиям приводит необоснованное включение признака Индексировать на измерениях и реквизитах регистра.
Каждая индексная структура требует физической памяти и ресурсов процессора при изменении данных. При высокой интенсивности проведения документов (при записи движений в транзакции) СУБД вынуждена одновременно обновлять не только данные основной таблицы, но и все существующие физические индексы. Это влечет за собой:
deadlocks) при параллельной работе пользователей.Подводя итог: для оборотных регистров включение свойства Индексировать необходимо, если по данному измерению планируются частые отборы. Для регистров остатков первое измерение уже входит в состав основного индекса итогов, поэтому дополнительное одиночное индексирование первого измерения чаще всего избыточно и снижает производительность системы при записи.