При работе с системой 1С:Предприятие 8.3 многие разработчики сталкиваются с вопросом, касающимся внутренней структуры хранения данных, а именно – порядка полей в кластерных индексах периодических регистров сведений. На первый взгляд, это может показаться незначительной деталью, но для оптимизации производительности и понимания работы платформы знание таких нюансов критически важно. Мы рассмотрим, почему в версии 8.3 произошла существенная рокировка порядка полей в кластерном индексе по сравнению с 8.2, и в чем практический смысл этого изменения.
Прежде чем углубиться в причины, давайте зафиксируем, что именно изменилось. В версии 1С:Предприятие 8.2 для периодических регистров сведений кластерный индекс традиционно формировался по принципу: сначала поле Период, а затем все измерения регистра. Таким образом, структура выглядела как Период + Измерение1 + Измерение2 + ... + ИзмерениеN.
Ситуация изменилась в 1С:Предприятие 8.3, особенно начиная примерно с версии 8.3.13. Теперь кластерным стал индекс, в котором сначала следуют все измерения, а поле Период располагается на последнем месте. Новая структура выглядит так: Измерение1 + Измерение2 + ... + ИзмерениеN + Период.
Важно отметить, что, как показывает анализ, оба типа индексов (с Периодом в начале и Периодом в конце) существовали и ранее, однако именно кластерный индекс поменял свою приоритетность. Помимо этого, в 8.3 для периодических регистров сведений создаются и другие индексы, например, некластерный индекс по Периоду или по СледующийПериод + Измерения, что также свидетельствует о более комплексном подходе к индексированию.
Для нас, как для 1С-разработчиков и экспертов, понимание этих изменений не просто академический интерес. Это знание является частью требований для сдачи экзамена "1С:Специалист-консультант" по технологическим вопросам и помогает более глубоко понимать, как платформа взаимодействует с базой данных, а следовательно – как более эффективно оптимизировать производительность приложений.
Прежде чем обсуждать причины рокировки, давайте вспомним, что такое кластерный индекс. В системах управления базами данных (СУБД), таких как Microsoft SQL Server или PostgreSQL, кластерный индекс является особым типом индекса.
Порядок полей в составном кластерном индексе имеет критическое значение. Если наиболее часто используемые в отборах поля находятся в начале индекса, СУБД может гораздо быстрее сузить область поиска. Если же эти поля находятся в конце, индексу придется сканировать значительно больше данных, что снижает эффективность.
Изменение порядка полей в кластерном индексе для периодических регистров сведений в 1С 8.3 было продиктовано несколькими важными факторами, направленными на повышение общей производительности системы и оптимизацию работы с типовыми запросами.
Рассмотрим, как мы обычно работаем с периодическими регистрами сведений. Чаще всего мы не ищем данные за конкретную дату по всем измерениям сразу. Напротив, мы выполняем следующие типовые запросы:
В случае, когда кластерный индекс начинается с Измерение1 + Измерение2 + ... + ИзмерениеN, а затем идет Период, СУБД может значительно быстрее выполнить такие запросы. Мы сначала "приходим" к нужной группе данных, отфильтрованной по значениям измерений, а затем внутри этой небольшой группы легко находим нужный Период (самый последний, самый ранний или в определенном диапазоне).
Представим, что у нас есть регистр цен, где измерения — это Номенклатура и ТипЦены.
Если кластерный индекс Период + Номенклатура + ТипЦены (как в 8.2), и мы ищем последнюю цену для Номенклатуры "Стол" и ТипаЦены "Розничная", СУБД придется сканировать все записи по Периоду, чтобы найти нужную Номенклатуру и ТипЦены. Поле Период имеет высокую селективность (очень много уникальных значений, если периодичность день или секунда), что делает такой поиск неэффективным. Для трех лет активно используемого регистра это может быть более тысячи уникальных значений, что часто больше, чем количество контрагентов или даже номенклатуры.
Напротив, при индексе Номенклатура + ТипЦены + Период (как в 8.3), СУБД сначала быстро находит все записи по Номенклатуре "Стол" и ТипуЦены "Розничная", поскольку они физически расположены рядом. Затем внутри этой компактной группы найти запись с максимальным Периодом становится значительно быстрее. Таким образом, запросы "срезов", которые являются одними из наиболее частых для периодических регистров, получают существенное ускорение.
Это изменение позволяет запросам чаще "попадать" в кластерный индекс, что снижает ресурсоемкость и увеличивает общую пропускную способность системы.
Еще одна важная причина для изменения порядка индекса связана с проблемами конкурентного доступа и блокировок в СУБД. При активной работе с периодическими регистрами, особенно подчиненными регистрами сведений, а также при выполнении операций по расчету итогов или срезов, могли возникать ситуации с взаимными блокировками (дедлоками) на таблицах. Изменение структуры кластерного индекса может способствовать уменьшению таких конфликтов, поскольку изменяет физический порядок доступа и блокировки данных на уровне СУБД. Это особенно актуально для регистров, использующих механизмы срезов последних/первых, которые активно применяются в таких конфигурациях, как 1С:ERP.
В 1С 8.3 платформа значительно эволюционировала, в том числе в части работы с временными и виртуальными таблицами. Появились механизмы, которые в определенных случаях позволяют СУБД создавать физические таблицы для хранения результатов срезов первых и последних. Новый порядок кластерного индекса (Измерения + Период) лучше согласуется с логикой работы этих физических таблиц срезов, позволяя платформе более эффективно их использовать и поддерживать.
Помимо кластерного индекса, платформа 1С создает и другие индексы, которые также играют важную роль в оптимизации:
Период + имя-измерения-1 + ... + имя-измерения-N (может быть некластерным в 8.3).имя-измерения-1 + ... + имя-измерения-N + Период (кластерный в 8.3).СледующийПериод + имя-измерения-1 + ... + имя-измерения-N. Поле СледующийПериод – это служебное поле, содержащее значение Периода следующей по возрастанию записи с теми же значениями измерений. Оно используется для оптимизации операций, связанных с выборкой интервальных значений.Активность, которое также способствует оптимизации при фильтрации по активным записям.ПолучитьСтруктуруХраненияБазыДанных(). Это позволяет на практике увидеть, какие индексы и в каком порядке были созданы для конкретного объекта.Изменение порядка полей в кластерном индексе периодических регистров сведений в 1С:Предприятие 8.3 — это не случайность, а продуманная эволюция платформы, направленная на повышение производительности и адаптацию к наиболее частым сценариям использования данных. Перестановка Периода в конец кластерного индекса после всех измерений значительно ускоряет выполнение запросов "срезов" и отборов по измерениям, минимизирует риски блокировок и лучше интегрируется с обновленными механизмами работы с физическими таблицами срезов. Понимание этих внутренних механизмов позволяет нам писать более эффективный код и строить более производительные системы на платформе 1С.