Индексы
Ключевые характеристики:
-
Что такое индекс: Служебный объект БД, созданный на основе одного или нескольких полей
-
Главная задача: Ускорение поиска данных в СУБД (особенно на больших объемах)
-
Без индекса: Полное сканирование таблицы (Table Scan) — неэффективно
Виды индексов
| Кластерный индекс | Некластерный индекс | |
|---|---|---|
| Аналог | Оглавление книги (порядок страниц = содержание) | Алфавитный указатель в конце книги |
| Кол-во | 1 на таблицу | Много на таблицу |
| Скорость | Максимальная (данные сразу там) | Высокая, но требует перехода по ссылке (найти запись в индексе, затем по ссылке перейти к данным) |
| Что хранит | Сами строки данных (таблица отсортирована) | Копия ключевых полей + ссылка на строку. Существует отдельно от данных. Сам индекс хранится в одном месте в виде b-дерева, а данные — в другом |
| Влияние | Меняет физический порядок хранения | Не меняет физический порядок |
Простая аналогия:
- Таблица без кластерного индекса = куча бумаг в коробке. Чтобы найти что-то, надо перерыть всю коробку.
- С кластерным индексом = бумаги подшиты в папку в строгом орядке.
- Некластерный индекс = отдельный список с номерами листов, лежащий рядом с коробкой.
Управление индексами в 1С
| Тип | Как создается | Когда использовать |
|---|---|---|
| Системные | Автоматически платформой. Можно включить "Индексировать" у реквизита. | Для часто фильтруемых полей. Несколько отмеченных реквизитов → отдельные индексы, а не один составной |
| Дополнительные (только для лицензии КОРП) | Вручную в конфигураторе. Можно создать составной индекс (несколько полей). | Для оптимизации конкретных медленных запросов. Порядок полей критичен |
Важные ограничения:
- СУБД может ограничивать кол-во полей (например, 16)
- Нельзя включать:
ХранилищеЗначения, строки неограниченной длины - Платформа предотвращает дублирование физических индексов
Мифы и правда
| Миф | Реальность |
|---|---|
| «Чем больше индексов — тем лучше» | Опасно! Каждый индекс замедляет запись, занимает место. Нужен баланс |
| «1С создаст все нужные индексы сама» | Частично. Базовые — да. Для ваших запросов — нужны ручные настройки |
| «Поле в индексе = будет работать быстро» | Недостаточно. Для составных важен порядок. Отбор должен начинаться с первого поля индекса |
| Настройка 'Индексировать' создаст составной индекс | Создаёт отдельные индексы на каждое поле. Для составного — нужны дополнительные индексы (КОРП) |
| «Во все ВТ нужен индекс» | Не всегда. Для малых таблиц полное сканирование быстрее. Смотреть план запроса |
Критические нюансы
-
Порядок измерений в регистрах
-
Влияет на структуру индекса
-
Главными факторами при формировании индекса являются:
- Высокая селективность поля (способность эффективно сужать выборку);
- Частота использования поля в условиях отбора (фильтрах запросов);
- Порядок полей в индексе, так как СУБД может использовать индекс только с первого поля последовательно.
Селективность и частота использования — являются важными и должны учитываться совместно при проектировании индексов
-
-
Индексировать с доп. упорядочиванием
- Для чего: Оптимизация динамических списков с отбором и сортировкой
- Как работает: Создает индекс по реквизиту + плюс сортировочное поле (Код/Наименование для справочников, Дата и Ссылка для документов)
- Когда использовать: Когда часты отборы по реквизиту с последующей сортировкой по умолчанию.
Ответы на ключевые вопросы
1. Почему запрос может не использовать индекс?
- Отбор не начинается с первого поля составного индекса
- Используются функции над полем
- Выбирается большой % данных (оптимизатор решает, что сканирование быстрее)
2. Когда добавлять индекс во временную таблицу?
- Когда таблица большая (тысячи+ строк)
- И есть частые поиски/соединения по конкретным полям
- Всегда проверять план запроса до/после
3. Что такое покрывающий индекс?
- Покрывающий индекс (covering index) — это индекс, который содержит все поля, необходимые для выполнения конкретного запроса. В результате СУБД может получить ответ, обратившись только к индексу, без необходимости делать дополнительный переход к самой таблице