К статье
Практический материал

Администрирование · 11 мин

Что такое кластерный индекс в 1С и как он влияет на скорость базы

Что такое кластерный индекс в 1С, как он устроен на уровне СУБД, когда ускоряет запросы, а когда замедляет базу. Практические рекомендации и типичные ошибки.

Кластерный индекс — это способ физического упорядочивания строк таблицы на диске по значению ключа индекса. В контексте 1С речь почти всегда идёт о базах на Microsoft SQL Server или PostgreSQL, где платформа хранит данные справочников, документов и регистров в виде обычных таблиц СУБД. Понимание того, какой ключ выбран кластерным, напрямую влияет на скорость проведения документов, выполнения запросов и регламентных операций.

У таблицы может быть только один кластерный индекс, потому что сами данные физически отсортированы лишь одним способом. Все остальные индексы таблицы — некластерные: они хранят отдельную структуру с указателями на строки. В типовых конфигурациях 1С платформа сама решает, какие индексы создавать и какой из них делать кластерным, но администратор и разработчик могут влиять на это через свойства метаданных и, в особых случаях, на уровне СУБД.

Практическая ценность темы в том, что неудачно выбранный кластерный индекс — частая причина медленной вставки документов, фрагментации таблиц и блокировок. Особенно это заметно на больших регистрах накопления и сведений, куда ежедневно записываются миллионы строк. Ниже разобрано, как устроен механизм, как проверить текущее состояние индексов и когда вмешательство оправдано.

Как устроен кластерный индекс на уровне СУБД

Когда 1С разворачивает базу на SQL Server, каждая таблица (например, табличная часть документа или регистр сведений) получает набор индексов. Кластерный индекс организует данные в виде B-дерева, листовые страницы которого содержат сами строки таблицы, отсортированные по ключу. Поэтому поиск по диапазону ключа кластерного индекса выполняется последовательным чтением соседних страниц — это самый быстрый сценарий доступа к данным.

Некластерный индекс хранит только ключевые колонки и ссылку на строку (ключ кластерного индекса). Если запрос использует некластерный индекс, СУБД сначала находит ключи, а затем обращается к кластерной структуре за остальными полями — это операция lookup, которая при большом числе строк обходится дорого. Именно поэтому выбор кластерного ключа — архитектурное решение, влияющее на все запросы к таблице.

Важно понимать, что в файловом варианте 1С понятие кластерного индекса в классическом смысле неприменимо — там платформа использует собственный формат хранения. Всё, что касается управления кластерными индексами, относится к клиент-серверному варианту работы.

Какие кластерные индексы создаёт платформа 1С

Платформа формирует индексы автоматически при создании и реструктуризации таблиц. Для справочников и документов кластерным, как правило, становится индекс по ссылке (внутреннему уникальному идентификатору объекта). Для регистров сведений кластерный индекс строится по измерениям (и периоду для периодических регистров). Для регистров накопления и бухгалтерии — по комбинации, включающей регистратор и измерения.

Ключевой нюанс: ссылка в 1С — это GUID. Если кластерный индекс построен по GUID, новые записи вставляются в случайные места B-дерева, что вызывает расщепление страниц, фрагментацию и рост журнала транзакций. Для таблиц с интенсивной вставкой это заметная проблема производительности.

Разработчик может влиять на индексирование через свойства метаданных: свойство «Индексировать» у реквизитов, ведущие измерения регистров, признак «Ведущее» у измерений регистров сведений. Эти настройки определяют состав индексов, которые платформа создаст при обновлении конфигурации.

ПризнакМедленное проведение документов

Проверьте фрагментацию кластерных индексов регистров, куда пишет документ

ПризнакБыстрый рост размера таблицы

Возможна фрагментация из-за кластерного ключа по GUID и расщепления страниц

ПризнакДолгие запросы по периоду

Проверьте, входит ли дата в кластерный ключ таблицы регистра

Как проверить, какой индекс кластерный

На уровне SQL Server информацию об индексах таблицы можно получить системным запросом к представлениям sys.indexes и sys.tables. Тип индекса с признаком clustered (type = 1) и будет искомым. Для таблиц 1С имена выглядят как _Document123, _InfoRg456 и подобные — соответствие метаданным можно выяснить через функцию ПолучитьСтруктуруХраненияБазыДанных() в конфигураторе.

sql
SELECT t.name AS TableName, i.name AS IndexName, i.type_desc FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id WHERE i.type = 1 ORDER BY t.name;

Дополнительно полезно посмотреть фрагментацию индексов через sys.dm_db_index_physical_stats. Если фрагментация кластерного индекса большой таблицы существенно превышает 30%, это кандидат на перестроение (rebuild), а не на смену ключа. План запроса в SQL Server Management Studio покажет, какие индексы реально используются при выполнении проблемных запросов.

Когда стоит менять кластерный индекс

Ручная смена кластерного индекса — крайняя мера, оправданная только при доказанной проблеме. Типичный сценарий: огромный регистр сведений или накопления с интенсивной записью, где кластерный ключ по GUID-регистратору вызывает постоянную фрагментацию, а основные запросы читают данные по периоду и измерениям. Перенос кластерного индекса на комбинацию «период + измерения» может кардинально ускорить и запись, и чтение.

Противоположный сценарий — когда кластерный ключ уже выбран удачно, а проблема в отсутствии некластерных индексов под конкретные запросы. В этом случае менять кластерный индекс не нужно: достаточно добавить индекс на уровне СУБД (с пониманием, что обновление конфигурации его не удалит, если он не конфликтует с метаданными) или пересмотреть сам запрос.

Маршрут решения

Как выбрать действие

Запросы медленные, но фрагментация индексов низкаяАнализируйте планы запросов и добавляйте некластерные индексы, кластерный не трогайте
Высокая фрагментация кластерного индекса по GUID на таблице с активной вставкойСначала настройте регулярное перестроение индексов, оцените эффект
После перестроения фрагментация быстро возвращаетсяРассмотрите смену кластерного ключа на монотонно возрастающий (период, дата)
Проблемы с блокировками при параллельной записиПроверяйте управляемые блокировки и индексы по измерениям, а не только кластерный ключ

Как безопасно изменить кластерный индекс

Изменение выполняется на уровне СУБД: существующий кластерный индекс удаляется, создаётся новый с нужным ключом. Операция на большой таблице ресурсоёмкая — фактически это полная перестройка данных. Выполнять её нужно вне рабочего времени, при наличии свежей резервной копии и достаточного места в журнале транзакций и tempdb.

Порядок действий
  1. 1
    Сделайте полную резервную копию базы и проверьте её восстановление на тестовой копии
  2. 2
    Определите таблицу и текущий кластерный индекс, зафиксируйте метрики: длительность запросов, фрагментацию
  3. 3
    На тестовой копии создайте новый кластерный индекс и удалите старый
  4. 4
    Прогоните типовые запросы и проведение документов, сравните планы и время выполнения
  5. 5
    При подтверждённом эффекте повторите операцию на рабочей базе в окно обслуживания
  6. 6
    Зафиксируйте изменение в документации: обновления конфигурации не должны его затереть

После смены кластерного индекса обязательно обновите статистику и проверьте, что обновление конфигурации базы данных не пытается вернуть структуру к типовой. Если платформа при реструктуризации пересоздаёт индексы, нештатные изменения могут быть потеряны — это нужно учитывать в регламенте сопровождения.

Типичные ошибки и ограничения

Типичные ошибки
01
Менять кластерный индекс без анализа планов запросов — вместо ускорения получают деградацию других операций
02
Игнорировать фрагментацию и не настраивать регламентное перестроение индексов — база деградирует со временем
03
Делать кластерным индекс по широкому ключу из многих колонок — раздуваются все некластерные индексы таблицы
04
Забывать, что ключ кластерного индекса входит в каждый некластерный индекс — длинный ключ увеличивает размер и время всех операций
05
Применять изменения сразу на рабочей базе без тестирования на копии

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

Также помните, что оптимизация индексов не заменяет работу с самими запросами и конфигурацией. Медленный запрос с неявными преобразованиями типов или сканированием таблицы не ускорится от смены кластерного ключа — сначала нужно смотреть план выполнения.

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

Как проверить результат после изменений

Контрольные точки

Как проверить результат

Время выполнения целевых запросов
Норма

Стабильно снизилось при повторных запусках

Тревожный признак

Время не изменилось или выросло, план запроса не изменился

Фрагментация кластерного индекса
Норма

Остаётся низкой спустя дни активной работы

Тревожный признак

Быстро возвращается к высоким значениям

Скорость проведения документов
Норма

Проведение и запись в регистры ускорились или не изменились

Тревожный признак

Запись стала медленнее из-за расщеплений страниц

Блокировки и взаимоблокировки
Норма

Количество не выросло в мониторинге СУБД

Тревожный признак

Появились новые конфликты при параллельной записи

Оценивайте эффект комплексно: ускорение одного запроса не должно достигаться ценой замедления записи. Собирайте метрики до и после изменения в одинаковых условиях нагрузки, иначе сравнение будет некорректным.

Частые вопросы о кластерных индексах в 1С

Может ли таблица 1С не иметь кластерного индекса?

Теоретически да — такая таблица называется кучей (heap). На практике платформа 1С создаёт кластерные индексы для основных таблиц автоматически, и работа с кучей для типовых объектов не предусмотрена. Кучи ухудшают производительность при большинстве операций чтения.

Удалит ли обновление конфигурации индекс, созданный вручную в SQL Server?

Индексы, не описанные в метаданных, обычно сохраняются при обновлении, если они не конфликтуют по именам и структуре с теми, что создаёт платформа. Однако при реструктуризации таблицы платформа может пересоздавать индексы, поэтому все ручные изменения нужно документировать и проверять после каждого обновления конфигурации.

Чем кластерный индекс отличается от индексирования реквизита в конфигураторе?

Свойство «Индексировать» у реквизита в конфигураторе указывает платформе создать индекс по этому полю — как правило, некластерный. Кластерный индекс определяет физический порядок хранения всей таблицы, и его ключ платформа выбирает по своим правилам, обычно по ссылке, измерениям или регистратору.

Нужно ли что-то настраивать с кластерными индексами в файловой базе 1С?

Нет. Файловый вариант использует собственный формат хранения платформы, где понятия кластерного индекса СУБД нет. Для ускорения файловой базы доступны только средства платформы: индексирование реквизитов в метаданных и оптимизация запросов.

Как часто нужно перестраивать кластерные индексы?

Единой нормы нет: частота зависит от интенсивности записи. Ориентируйтесь на фактическую фрагментацию — настройте регламентное задание, которое перестраивает индексы с фрагментацией выше порогового значения (часто используют 30%), и выполняйте его в периоды минимальной нагрузки, обычно еженедельно или ежедневно для высоконагруженных баз.

Ускорит ли смена кластерного индекса все запросы к таблице?

Нет. Новый кластерный ключ ускорит только запросы, читающие диапазоны по этому ключу. Запросы по другим полям могут не измениться или даже замедлиться, если раньше их обслуживал старый кластерный индекс. Поэтому решение принимается по совокупности типовых запросов к таблице.

Итог

Что важно запомнить

Кластерный индекс определяет физический порядок строк таблицы и существует у таблицы в единственном экземпляре. Платформа 1С создаёт его автоматически, и вмешательство оправдано только при доказанной проблеме: сначала регламентное обслуживание и анализ планов запросов, затем — тестируемая на копии смена кластерного ключа с обязательной резервной копией.