В каком случае используешь индексы в запросах?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Использование индексов в запросах 1С
Индексы — это критический инструмент оптимизации производительности при работе с данными в 1С. Их правильное использование может улучшить скорость выполнения запросов в десятки раз. Рассмотрю основные сценарии и подходы к их применению.
Когда использовать индексы
1. Фильтрация по часто используемым полям
Индексы наиболее эффективны для полей, которые часто используются в условиях WHERE запросов:
// Типичный запрос с фильтрацией
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Документ.Ссылка,
| Документ.Номер,
| Документ.Дата
|ИЗ
| Документ.РасходнаяНакладная КАК Документ
|ГДЕ
| Документ.Дата >= &ДатаНачала
| И Документ.Дата <= &ДатаОкончания
| И Документ.Статус = &Статус";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Дата));
Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыНакладной.Выполнена);
Для такого запроса индексы нужны на полях: Дата, Статус.
2. Сортировка данных (ORDER BY)
Индексы на полях, используемых в ORDER BY, значительно ускоряют сортировку:
Запрос.Текст = "ВЫБРАТЬ
| Документ.Ссылка,
| Документ.Номер,
| Документ.Дата
|ИЗ
| Документ.ПриходнаяНакладная КАК Документ
|ПОРЯДОК ПО
| Документ.Дата УБЫВ,
| Документ.Номер";
Составной индекс на (Дата, Номер) будет оптимален.
3. Соединение таблиц (JOIN)
Индексы на полях связей критичны для производительности джойнов:
Запрос.Текст = "ВЫБРАТЬ
| Товары.Товар,
| Товары.Количество,
| ТоварыСпр.Наименование,
| ТоварыСпр.ЕдиницаИзмерения
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК Товары
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.Товары КАК ТоварыСпр
| ПО Товары.Товар = ТоварыСпр.Ссылка";
Индекс на ТоварыСпр.Ссылка необходим для быстрого поиска совпадений.
4. Большие таблицы и количество записей
Индексы становятся все более критичны по мере роста объема данных:
- До 1000 записей: индексы практически не влияют
- 1000-10000 записей: индексы дают значительный прирост
- Более 100000 записей: индексы абсолютно необходимы
Типы индексов
Простой индекс (по одному полю)
Индекс "ИндексПоДате" По Дата;
Составной индекс (по нескольким полям)
Индекс "ИндексПоДатеИСтатусу" По Дата, Статус;
Индекс с условием фильтра
Индекс "ИндексПроведённых" По Статус
ГДЕ Проведён = Истина;
Когда НЕ использовать индексы
- Маленькие таблицы (менее 100 записей) — индексы замедляют вставку и удаление
- Редко используемые поля — расходы на обслуживание индекса больше пользы
- Поля с низкой селективностью (булевы поля, перечисления с 2-3 значениями)
- Неупорядоченные данные, которые часто изменяются — индекс нужно пересчитывать
Анализ плана запроса
В 1С стандартный способ проверить использование индекса — анализ плана запроса:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ТОП 1 Ссылка ИЗ Справочник.Товары ГДЕ Код = &Код";
Запрос.УстановитьПараметр("Код", "001234");
Результат = Запрос.Выполнить();
// План запроса показывается в отладчике при включенном режиме профилирования
Описание = Запрос.ТекстЗапроса + "\n\nПлан выполнения в профилировщике";
Практические рекомендации
- Профилируй перед оптимизацией — используй режим профилирования для поиска узких мест
- Индексируй с умом — каждый индекс требует ресурсов при модификации данных
- Комбинируй индексы — часто составной индекс лучше, чем несколько простых
- Проверяй селективность — индекс на поле с 2 значениями бесполезен
- Регулярно пересчитывай индексы — особенно для таблиц с активной модификацией данных
В итоге, правильное использование индексов — это баланс между скоростью чтения данных и производительностью операций записи.