Разработка и Конфигурация · 10 мин
Индексы в 1С: что это такое и как они ускоряют работу базы
Что такое индексы в 1С, как они ускоряют поиск и выборки, какие индексы создаются автоматически и как добавить свои. Практические советы по оптимизации базы 1С.
Индекс в 1С — это служебная структура данных в базе, которая позволяет платформе находить нужные записи без полного перебора таблицы. По аналогии с предметным указателем в книге: вместо чтения всех страниц вы сразу открываете нужную. Без индексов любой запрос к справочнику с сотнями тысяч элементов превращается в последовательное сканирование таблицы, и база начинает заметно «тормозить».
Платформа 1С:Предприятие создаёт часть индексов автоматически — по ключевым полям объектов (код, номер, дата, ссылка, владелец). Однако типовых индексов часто недостаточно для реальных запросов конфигурации: отборы по реквизитам, соединения таблиц и сложные отчёты требуют дополнительных индексов, которые разработчик добавляет вручную в конфигураторе.
Понимание того, как устроены индексы, важно и разработчику, и администратору базы. Неправильно спроектированные индексы — одна из главных причин медленной работы 1С: одни запросы выполняются минутами, другие блокируют таблицы при записи. При этом избыток индексов тоже вреден: каждый индекс замедляет запись данных и занимает место.
Как индексы устроены в базе данных 1С
Физически 1С хранит данные в СУБД — обычно это Microsoft SQL Server, PostgreSQL или файловый вариант с собственным форматом. Индекс представляет собой отсортированную структуру (чаще всего B-дерево), где значения индексируемых полей упорядочены, и к каждому значению привязана ссылка на строку таблицы. Поиск по такому дереву занимает доли секунды даже в таблице с миллионами записей.
Когда выполняется запрос с условием ГДЕ Номенклатура = &Номенклатура, СУБД проверяет, есть ли подходящий индекс. Если есть — сервер идёт по дереву индекса и сразу получает нужные строки. Если индекса нет — выполняется полное сканирование таблицы (table scan), и время выполнения растёт пропорционально её размеру.
Важно понимать, что индекс эффективен только тогда, когда условие запроса совпадает с началом индексного ключа. Для составного индекса по полям «Организация + Номенклатура» запрос с отбором только по номенклатуре этот индекс, скорее всего, не использует — порядок полей в индексе имеет значение.
Какие индексы 1С создаёт автоматически
Платформа без участия разработчика строит набор стандартных индексов для каждого объекта метаданных. Знание этого списка избавляет от лишней работы — не нужно индексировать то, что уже проиндексировано.
- Ссылка (уникальный идентификатор) — для всех ссылочных объектов;
- Код и номер — для справочников и документов;
- Дата + ссылка — для документов (поэтому журналы документов быстро листаются по датам);
- Владелец и родитель — для подчинённых и иерархических справочников;
- Период + регистратор, измерения — для регистров сведений и накопления;
- Поля, входящие в критерии отбора и связи по типу.
Для регистров платформа автоматически индексирует измерения — именно поэтому отборы по измерениям в запросах к регистрам обычно работают быстро. А вот отбор по ресурсу или реквизиту регистра уже требует ручной индексации.
Как добавить свой индекс в конфигураторе
Самый простой способ — включить индексацию реквизита. Откройте объект в конфигураторе, выберите реквизит и в палитре свойств установите свойство «Индексировать» в значение «Индексировать» или «Индексировать с доп. упорядочиванием». После обновления конфигурации базы данных платформа создаст индекс в СУБД.
Для составных индексов используется отдельный механизм: в палитре свойств объекта есть ссылка «Индексы», открывающая редактор, где можно добавить индекс из нескольких полей в нужном порядке. Первым ставьте поле, по которому чаще всего идёт отбор, — с учётом правила «левого префикса».
- 1Найдите медленный запрос и определите поля в условии ГДЕ и в соединениях
- 2Проверьте, какие из этих полей уже проиндексированы автоматически
- 3В конфигураторе откройте объект и установите «Индексировать» у нужного реквизита или создайте составной индекс
- 4Обновите конфигурацию базы данных (в клиент-серверном варианте это может занять время на больших таблицах)
- 5Проверьте план запроса: убедитесь, что сканирование таблицы заменилось поиском по индексу
На больших таблицах реструктуризация с созданием индекса может занять продолжительное время и заблокировать таблицу. Планируйте обновление на нерабочие часы и обязательно делайте резервную копию перед изменением структуры базы.
Когда индекс нужен, а когда он вредит
Индекс ускоряет чтение, но замедляет запись: при каждом добавлении или изменении записи СУБД обновляет все индексы таблицы. Поэтому индексы создают не «про запас», а под конкретные запросы.
Как выбрать действие
Типичный признак избытка индексов — проведение документов и запись в регистры замедляются по мере роста базы, хотя запросы работают быстро. В этом случае проанализируйте, какие индексы реально используются (в MS SQL Server это видно в динамических представлениях sys.dm_db_index_usage_stats), и уберите неиспользуемые.
Как проверить, используется ли индекс
Главный инструмент проверки — план запроса. В технологическом журнале 1С можно включить сбор событий СУБД и увидеть, какой план выбрал сервер: поиск по индексу (index seek) или сканирование (scan). Для MS SQL Server план удобно смотреть в Management Studio, включив отображение фактического плана выполнения.
На уровне платформы помогает консоль запросов с замером времени выполнения: сравните длительность запроса до и после добавления индекса на копии базы. Если время не изменилось — либо индекс не используется (проверьте порядок полей и типы сравниваемых значений), либо узкое место находится в другом месте запроса.
Как проверить результат
Операция Index Seek по созданному индексу
Clustered Index Scan или Table Scan по большой таблице
Заметное сокращение времени после добавления индекса
Время не изменилось или выросло
Запись не замедлилась ощутимо
Проведение стало медленнее — индексов слишком много
Индексы в запросах: особенности языка запросов 1С
Чтобы индекс сработал, запрос должен быть написан корректно. Несколько практических правил: сравнивайте поля с параметрами того же типа (приведение типов в условии может отключить индекс), избегайте функций над индексируемым полем в условии отбора, а в соединениях таблиц используйте проиндексированные поля.
Для виртуальных таблиц регистров (остатки, обороты) отборы нужно передавать в параметры виртуальной таблицы, а не в общее условие ГДЕ. Параметры виртуальной таблицы применяются на уровне индексов физической таблицы, а внешний отбор — уже после выборки, что на больших регистрах критично.
Перед добавлением индекса снимите показания медленного запроса: текст запроса, время выполнения, размер таблицы. После изменения сравните те же показатели на той же копии базы. Так вы получите доказательство эффекта и сможете откатить изменение, если оно не помогло.
Обслуживание индексов в клиент-серверной базе
Со временем индексы фрагментируются: страницы перестают идти подряд, и чтение замедляется. В клиент-серверном варианте нужно регулярно выполнять регламентные операции СУБД — обновление статистики и реиндексацию (перестроение или реорганизацию индексов). Устаревшая статистика приводит к тому, что оптимизатор выбирает неудачный план даже при наличии правильных индексов.
В файловом варианте аналогичную роль играет тестирование и исправление информационной базы с включённой реиндексацией. Запускайте его только при монопольном доступе и после резервного копирования — процедура перестраивает таблицы и при прерывании может повредить файл базы.
Частые вопросы об индексах в 1С
Почему запрос медленный, хотя индекс по полю создан?
Чаще всего условие запроса не совпадает с началом индексного ключа: для составного индекса отбор идёт не по первому полю, в условии применена функция к полю или типы сравниваемых значений различаются. Проверьте фактический план запроса в СУБД — он покажет, используется ли индекс.
Чем «Индексировать» отличается от «Индексировать с доп. упорядочиванием»?
Второй вариант добавляет в индекс дополнительное поле упорядочивания (например, ссылку), что ускоряет выборки с сортировкой по этому полю и однозначно определяет порядок записей. Обычному отбору достаточно простого варианта «Индексировать».
Можно ли создать индекс по нескольким реквизитам справочника?
Да. В палитре свойств объекта откройте редактор «Индексы» и добавьте составной индекс, указав поля в нужном порядке. Первым ставьте поле, которое чаще всего участвует в отборе, — запросы с отбором только по второму полю такой индекс использовать не смогут.
Нужно ли индексировать измерения регистров?
Как правило, нет — платформа автоматически создаёт индексы по измерениям регистров. Ручная индексация может понадобиться для реквизитов регистра, по которым строятся отборы в нестандартных запросах и отчётах.
Как понять, что проблема именно в индексах, а не в блокировках?
Посмотрите на симптомы: если запрос стабильно медленный вне зависимости от числа пользователей — вероятнее проблема плана и индексов. Если запрос «зависает» только в часы активной работы и ускоряется в пустой базе — ищите блокировки через технологический журнал и мониторинг СУБД.
Ускорит ли базу добавление индексов «на всякий случай»?
Нет. Каждый лишний индекс замедляет запись, увеличивает размер базы и время реиндексации. Индексы создают под конкретные запросы с подтверждением эффекта через план запроса и замер времени.
Что важно запомнить
Индексы ускоряют чтение за счёт упорядоченного хранения значений полей, но замедляют запись. Базовые индексы 1С создаёт сама, дополнительные добавляйте только под реальные медленные запросы, проверяйте результат по плану запроса и не забывайте про регламентное обслуживание индексов в СУБД.