… Вряд ли сможете думать о чем-то другом.
Шпаргалка для вопроса: Назовите известные Вам типичные ошибки в коде конфигурации и структуре метаданных, которые могут привести к неоптимальной работе запроса. Дайте рекомендации по устранению ошибок.
Признаков неоптимальных запросов насчитывается более двадцати, запомнить такой список непросто. Поэтому я решил их классифицировать и сгруппировать. Итак:
- Ошибки в условиях
- Ошибки в соединениях
- Ошибки сортировки/группировки
- Некорректное использование виртуальных таблиц
- Прочие ошибки
Теперь подробнее.
Ошибки в формулировке условий: Параметры виртуальных таблиц, Соединения (ПО), ГДЕ
Проверять условия позже, чем надо
-
Данные передаются в плане запроса от оператора к оператору. Чем раньше удастся отсеять ненужные данные, тем быстрее будет работать запрос. Сначала идет формирование виртуальных таблиц, потом проверяются условия соединения (которые должны быть максимально простыми), позже всего проверяется условие «ГДЕ». Подробнее: //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
Ошибки сортировки/группировки
- Использование ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ – лишняя сортировка
- Повторная группировка виртуальных таблиц. Виртуальные таблицы остатков/оборотов сгруппированы по измерениям, участвующим в запросе
- Выбрать первые + сортировка. Проблема, если сортировка по неиндексируемому полю, или не первому в индексе
- Применять операцию "Различные" к выборке, заведомо не содержащей повторений.
Некорректное использование виртуальных таблиц
Вступайте в нашу телеграмм-группу Инфостарт