1C-Code → Теория → Индексы и скорость запросов
Индексы и скорость запросов в 1С
Почему запрос идёт минуту, что такое индекс, зачем временные таблицы и когда они не помогают.
Ниже — 2 вопроса с разбором. Всего по этой теме
7 вопросов, и в тренажёре они задаются вперемешку
и без подсказок: там проверяется, что тема уложилась, а не что её
приятно читать.
Пройти тему в тренажёре
Разбор
Что делает индекс по полю таблицы?
Хранит отсортированную структуру со ссылками на строки, поэтому поиск по этому полю не требует чтения всей таблицы — верно
Держит копию таблицы в оперативной памяти сервера, из-за чего повторные обращения к ней выполняются заметно быстрее
Заранее вычисляет и хранит агрегаты по полю, чтобы суммы и количества не пересчитывались при каждом запросе
Сжимает значения поля, уменьшая объём чтения с диска: меньше данных прочитано — быстрее выполнен запрос
Индекс — это упорядоченный список значений со ссылками на строки. Без него СУБД читает таблицу целиком, и время растёт вместе с ней.
Почему условие ГДЕ по полю без индекса может работать минутами?
СУБД вынуждена прочитать каждую строку таблицы и проверить условие; на миллионе строк это миллион чтений — верно
Платформа передаёт такие условия на сторону приложения и фильтрует полученные данные уже в памяти сервера 1С
Без индекса СУБД строит его на лету во временном файле, и время уходит именно на построение, а не на чтение
Такое условие выполняется в один поток, тогда как индексное чтение распараллеливается по ядрам процессора
Полное сканирование — это чтение всей таблицы. Пока строк тысячи, разницы не видно; на миллионах она превращается в минуты.
О чём ещё спрашивают по этой теме
Что такое покрывающий индекс?
Зачем в запросе используют временные таблицы вместо вложенных запросов?
Почему соединение с вложенным запросом считается опасным?
Что означает «неявное соединение» в языке запросов 1С?
Индексов много — почему нельзя проиндексировать всё подряд?
Ответы и разборы — в тренажёре.
Другие темы