… Вряд ли сможете думать о чем-то другом.
Шпаргалка для вопроса: Назовите известные Вам типичные ошибки в коде конфигурации и структуре метаданных, которые могут привести к неоптимальной работе запроса. Дайте рекомендации по устранению ошибок.
Признаков неоптимальных запросов насчитывается более двадцати, запомнить такой список непросто. Поэтому я решил их классифицировать и сгруппировать. Итак:
- Ошибки в условиях
- Ошибки в соединениях
- Ошибки сортировки/группировки
- Некорректное использование виртуальных таблиц
- Прочие ошибки
Теперь подробнее.
Ошибки в формулировке условий: Параметры виртуальных таблиц, Соединения (ПО), ГДЕ
Проверять условия позже, чем надо
-
Данные передаются в плане запроса от оператора к оператору. Чем раньше удастся отсеять ненужные данные, тем быстрее будет работать запрос. Сначала идет формирование виртуальных таблиц, потом проверяются условия соединения (которые должны быть максимально простыми), позже всего проверяется условие «ГДЕ». Подробнее: //infostart.ru/public/527529/
Отсутствие индекса
-
Гораздо лучше, если для запроса есть индекс, который содержит все поля данных и условий. (покрывающий индекс для запроса)
Невозможность применен ия индекса (Преобразования)
- Использование условия ИЛИ в запросах // Переписать запрос, используя "ОБЪЕДИНИТЬ ВСЕ". Кстати, проверка вхождения в список преобразуется внутри СУБД в условия "ИЛИ". В некоторых случаях оптимизатор может обработать "ИЛИ" правильно, например: "Контрагент.ИНН В &(Список)"
- Подзапросы в условиях, в том числе неявные, сложные условия // Упрощайте, используйте временные таблицы, внутренние соединения, избегайте оператор проверки вхождения.
-
Преобразования, арифметические выражения над индексированным полем
Невозможность применен ия индекса (Принципиально)
- Использование ПОДОБНО % // Вызывает сканирование таблицы, если процент помещен в начале шаблона.
- Использование условия на «НЕ РАВНО» или «НЕ» // Если проверяем условие не вхождения в список, лучше использовать левое соединение и проверку IS NULL.
- Использование поля составного типа примитивных и ссылочных значений // Поля составного типа преобразуются в СУБД в несколько столбцов.
Источники //infostart.ru/public/184361/, http://its.1c.ru/db/metod8dev#content:1828:hdoc
Ошибки в соедин ениях
- Соединение с подзапросами (виртуальными таблицами) // В плане запросов преобразуются в малопривлекательный для больших объемов данных Nested loops.
- Получение данных через точку от полей составного типа – неявные соединения // Пример полей: Регистратор, Субконто, Последовательность. Происходит левое соединение всех таблиц участвующих типов.
- Сложные запросы, использующие большое количество соединений // Оказывается, оптимизатор MS SQL плохо обрабатывает запросы, где 6-8 соединений и больше. Соединение - самый тяжелый оператор.
- Сложный, коррелированный запрос
- Использование полного соединения для Postgres. Источник http://its.1c.ru/db/metod8dev#content:1556:hdoc
Ошибки сортировки/группировки
- Использование ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ – лишняя сортировка
- Повторная группировка виртуальных таблиц. Виртуальные таблицы остатков/оборотов сгруппированы по измерениям, участвующим в запросе
- Выбрать первые + сортировка. Проблема, если сортировка по неиндексируемому полю, или не первому в индексе
- Применять операцию "Различные" к выборке, заведомо не содержащей повторений.
Некорректное использование виртуальных таблиц
- Указывать период в виртуальных таблицах вместо использования текущих итогов (Остатки, Срез последних 8.3)
- Использование таблицы Обороты для периода, меньшего месяца.
- Неполные условия внутри. // Поиск 1С по составным индексам можно сравнить с поиском адреса проживания. Если знаем город, знаем номер дома но не знаем улицу - поиск будет неприятным. Подходящий индекс содержит все поля, перечисленные в условии, поля в индексе идут подряд и между ними нет "зазоров".
Прочие ошибки
Внутри запроса
- Запросы виды ВЫБРАТЬ * ИЗ … // Если в объекте есть табличные части - звездочка получает их тоже.
- ДЛЯ ИЗМЕНЕНИЯ в автоматическом режиме, не указывать таблицы для блокировки
- Конструкции типа Ссылка.Ссылка
Снаружи запроса
- Выполнение запросов в цикле.
- Выполнение запросов через объектную модель.
- Неоптимальное использование RLS платформы // Следует делать запрос из привилегированного модуля, НЕ назначать две роли с RLS
- Расчет остатков/оборотов по таблицам документов и таблицам движений регистров
Источники
Е. В. Филиппов, "Настольная книга 1С:ЭКСПЕРТА", изд. 2 страницы 215-232
http://learning1c.blogspot.ru/2015/10/1-4.html
https://its.1c.ru/db/metod8dev#content:5842:hdoc
https://ausevich.ru/ekspert/tipichnye-oshibki-privodyashchie-k-neoptimalnoj-rabote-zaprosa/#more-413
Дисклаймер: шпаргалка не заменит полноценной подготовки.
Буду благодарен за положительные отзывы, за конструктивную критику – благодарен вдвойне. Когда писал статью, сомневался: упоминать ли про регламентные операции (пересчет итогов регистров, реиндекс базы, пересчет статистики). С одной стороны они влияют сильно, с другой - это не метаданные и не код, под вопрос не подходят.
P.S. обратите внимание на файл docs\ru\V8Update.htm в каталоге установки программы. Выполнил отбор информации по теме экзамена. Лично мне интересно: с какого релиза какое новшество началось.