Как индексы влияют на скорость работы запросов?


Индексы оказывают существенное влияние на скорость работы запросов, так как они позволяют сократить количество данных, которые необходимо просмотреть при выполнении операций фильтрации, сортировки, группировки и соединения таблиц. При наличии подходящих индексов система управления базой данных (СУБД), которая используется платформой 1С (чаще всего это Microsoft SQL Server или PostgreSQL), может находить нужные строки быстрее, чем при полном просмотре таблицы (так называемом «Table Scan»).

Как это работает

Когда запрос содержит условие отбора по какому-либо полю, СУБД анализирует, есть ли индекс по этому полю. Если индекс существует и может быть использован, СУБД строит план выполнения запроса, в котором задействуется индекс, — это позволяет быстро найти строки, удовлетворяющие условию, без необходимости просматривать все строки таблицы.

Индексы — это по сути структуры данных (чаще всего — деревья B-дерево или B+-дерево), где значения индексируемого поля упорядочены, и к ним хранятся ссылки на соответствующие строки основной таблицы. Такой подход позволяет использовать бинарный поиск, который работает быстрее линейного поиска при полном просмотре таблицы.

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

  1. Поиск по ключевым полям
    Если выполняется запрос вида ГДЕ Контрагент = &Контрагент, и поле Контрагент индексировано, то поиск нужных строк займёт гораздо меньше времени, чем при отсутствии индекса.

  2. Сортировка по индексированному полю
    Когда используется УПОРЯДОЧИТЬ ПО Дата, и по полю Дата есть индекс, СУБД может использовать его для возвращения отсортированных данных без дополнительной сортировки в памяти.

  3. Группировка
    Индексы по группируемым полям ускоряют выполнение агрегаций (например, СГРУППИРОВАТЬ ПО Склад, Номенклатура), поскольку система может быстрее найти и объединить нужные записи.

  4. Соединения
    Когда таблицы объединяются по полям, которые индексированы (например, по внешним ключам), соединение выполняется быстрее, так как можно быстро найти соответствующие строки во второй таблице.

Поведение без индексов

Если индекс отсутствует, СУБД вынуждена выполнять «Table Scan» — это означает, что она должна последовательно просматривать каждую строку таблицы, сравнивая значения полей с условием запроса. Это приводит к резкому увеличению времени выполнения запроса при увеличении количества строк.

Селективность и использование индексов

Эффективность индекса зависит от селективности — то есть от количества уникальных значений в поле:

  • Если поле содержит много одинаковых значений (например, поле «Валюта» с тремя значениями), то индекс может не использоваться, так как выгода от него будет минимальной.

  • Если же поле высоко-селективное (например, ИНН контрагента, уникальные коды или идентификаторы), то индекс очень эффективен, и его использование существенно снижает нагрузку на сервер.

Составные индексы

Индексы могут быть построены на нескольких полях одновременно. В этом случае они помогают ускорить запросы, где используются все или начальные поля составного индекса. Например, если есть индекс по (Склад, Номенклатура), он будет использоваться в запросах, где есть условия по Склад или одновременно по Склад и Номенклатура, но не будет работать, если указано только Номенклатура.

Использование в 1С

В платформе 1С индексы можно создавать в конфигураторе:

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

  • Для справочников и документов — на код, наименование, ссылки и реквизиты, участвующие в поиске.

Также при использовании систем компоновки данных (СКД), запросов и динамических списков платформа может задействовать индексы автоматически, если правильно составлены условия.

Почему индекс может не использоваться

  • В запросе используется вычисляемое выражение (например, ГДЕ ГОД(Дата) = 2024), которое не может быть напрямую связано с индексом по полю Дата.

  • Несоответствие типов данных (например, сравнение строки с числом).

  • Неучтённая коллатура или чувствительность к регистру (особенно в PostgreSQL).

  • Использование функции ПОДОБНО, КАК, СОДЕРЖИТ и других, которые нарушают предсказуемость.

Переполнение индексов

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

Анализ использования индексов

В системах с SQL Server можно использовать SQL Profiler или план выполнения запроса (Query Execution Plan), чтобы проверить, используется ли индекс при выполнении запроса. Это помогает выявить медленные запросы и оптимизировать их.

В PostgreSQL — используется EXPLAIN и ANALYZE, в встроенной СУБД — профилирование в отладчике платформы 1С.

Таким образом, индексы являются важным инструментом ускорения выполнения запросов, особенно при работе с большими объемами данных, и их грамотное использование критически важно для обеспечения высокой производительности 1С-систем.