← Назад к вопросам

В каком случае используешь индексы в запросах?

2.0 Middle🔥 181 комментариев
#Запросы и оптимизация#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование индексов в запросах 1С

Индексы — это критический инструмент оптимизации производительности при работе с данными в 1С. Их правильное использование может улучшить скорость выполнения запросов в десятки раз. Рассмотрю основные сценарии и подходы к их применению.

Когда использовать индексы

1. Фильтрация по часто используемым полям

Индексы наиболее эффективны для полей, которые часто используются в условиях WHERE запросов:

// Типичный запрос с фильтрацией
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
    |    Документ.Ссылка,
    |    Документ.Номер,
    |    Документ.Дата
    |ИЗ
    |    Документ.РасходнаяНакладная КАК Документ
    |ГДЕ
    |    Документ.Дата >= &ДатаНачала
    |    И Документ.Дата <= &ДатаОкончания
    |    И Документ.Статус = &Статус";
    
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Дата));
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыНакладной.Выполнена);

Для такого запроса индексы нужны на полях: Дата, Статус.

2. Сортировка данных (ORDER BY)

Индексы на полях, используемых в ORDER BY, значительно ускоряют сортировку:

Запрос.Текст = "ВЫБРАТЬ
    |    Документ.Ссылка,
    |    Документ.Номер,
    |    Документ.Дата
    |ИЗ
    |    Документ.ПриходнаяНакладная КАК Документ
    |ПОРЯДОК ПО
    |    Документ.Дата УБЫВ,
    |    Документ.Номер";

Составной индекс на (Дата, Номер) будет оптимален.

3. Соединение таблиц (JOIN)

Индексы на полях связей критичны для производительности джойнов:

Запрос.Текст = "ВЫБРАТЬ
    |    Товары.Товар,
    |    Товары.Количество,
    |    ТоварыСпр.Наименование,
    |    ТоварыСпр.ЕдиницаИзмерения
    |ИЗ
    |    Документ.РасходнаяНакладная.Товары КАК Товары
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |    Справочник.Товары КАК ТоварыСпр
    |    ПО Товары.Товар = ТоварыСпр.Ссылка";

Индекс на ТоварыСпр.Ссылка необходим для быстрого поиска совпадений.

4. Большие таблицы и количество записей

Индексы становятся все более критичны по мере роста объема данных:

  • До 1000 записей: индексы практически не влияют
  • 1000-10000 записей: индексы дают значительный прирост
  • Более 100000 записей: индексы абсолютно необходимы

Типы индексов

Простой индекс (по одному полю)

Индекс "ИндексПоДате" По Дата;

Составной индекс (по нескольким полям)

Индекс "ИндексПоДатеИСтатусу" По Дата, Статус;

Индекс с условием фильтра

Индекс "ИндексПроведённых" По Статус
    ГДЕ Проведён = Истина;

Когда НЕ использовать индексы

  • Маленькие таблицы (менее 100 записей) — индексы замедляют вставку и удаление
  • Редко используемые поля — расходы на обслуживание индекса больше пользы
  • Поля с низкой селективностью (булевы поля, перечисления с 2-3 значениями)
  • Неупорядоченные данные, которые часто изменяются — индекс нужно пересчитывать

Анализ плана запроса

В 1С стандартный способ проверить использование индекса — анализ плана запроса:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ТОП 1 Ссылка ИЗ Справочник.Товары ГДЕ Код = &Код";
Запрос.УстановитьПараметр("Код", "001234");

Результат = Запрос.Выполнить();

// План запроса показывается в отладчике при включенном режиме профилирования
Описание = Запрос.ТекстЗапроса + "\n\nПлан выполнения в профилировщике";

Практические рекомендации

  1. Профилируй перед оптимизацией — используй режим профилирования для поиска узких мест
  2. Индексируй с умом — каждый индекс требует ресурсов при модификации данных
  3. Комбинируй индексы — часто составной индекс лучше, чем несколько простых
  4. Проверяй селективность — индекс на поле с 2 значениями бесполезен
  5. Регулярно пересчитывай индексы — особенно для таблиц с активной модификацией данных

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