Комментарии (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 значениями бесполезен
- Регулярно пересчитывай индексы — особенно для таблиц с активной модификацией данных
В итоге, правильное использование индексов — это баланс между скоростью чтения данных и производительностью операций записи.
Похожие вопросы
- Какие есть виртуальные таблицы у регистра расчётов?
- Как расследуешь ошибки принимаемых запросов?
- Что такое контекст формы в 1С?
- Как организовать обмен данными между 1С и другими системами?
- Какие стандарты 1С по организации проведения документа вы знаете?
- Что такое транзакция в 1С? Есть ли вложенные транзакции?
- В чем разница между хранением информации в регистре сведений и в табличной части?
- Может ли быть таблица итогов у регистра сведений?
- Какие знаешь способы пользоваться запросом?
- Как организовать контроль остатков при проведении документа?
- Значения каких типов можно передавать в параметр "период" виртуальной таблицы регистра накоплений?
- Зачем использовать конструкцию ВЫРАЗИТЬ?
- Что такое COM-соединение в 1С и когда его использовать?
- Что такое индекс в 1С и какие виды индексов бывают?
- В чем разница между справочником и планом видов характеристик?
- Что такое NULL, Неопределено, ПустаяСсылка и БитаяСсылка в 1С? Чем они отличаются?
- Чем отличается подход к доработке типовых и нетиповых конфигураций?
- Что сделать чтобы можно было производить отладку кода программы, которая выполняется в фоновом задании?
- Что такое мутабельность объектов в 1С?
- Что происходит, когда мы обращаемся к объекту через точку?