В данной статье я хочу привести сводную информацию о типичных ошибках в тексте запроса, коде конфигурации и структуре метаданных, которые могут привести к неоптимальной работе запроса, с описанием причин и способов решения.
Описание ошибки | Раздел | Причина | Варианты решений | Примечание | Критичность |
---|---|---|---|---|---|
Несоответствие условий запроса индексам таблицы | Секции условий запросов (ГДЕ, ПО) |
|
|
Максимальная эффективность достигается если будет использован покрывающий индекс | Важно |
Подзапросы в условиях (ГДЕ, параметрах виртуальных таблиц) | Секции условий запросов (ГДЕ, ПО) | На уровне СУБД происходит неявное соединение с вложенным запросом, оптимизатор может неверно оценить количество строк в подзапросе и выбрать неоптимальный план выполнения | Поместить подзапрос в отдельную временную таблицу и обращаться к ней | Критично если оптимизатор СУБД может ошибиться с количеством строк в подзапросе условия, например: обращение происходит к виртуальной таблице; во вложенном запросе есть условие отбора; в подзапросе используется вложенный запрос | Важно |
Использование условия ИЛИ в запросах | Секции условий запросов (ГДЕ, ПО) | Возможно неэффективное использование индекса |
|
Не требуется если ИЛИ соединяет условия на равенство по одному и тому же полю (когда можно заменить на «В») | По необходимости |
Условия в запросе за скобками параметров виртуальных таблиц | Секции условий запросов (ГДЕ, ПО) | В SQL не существует понятия виртуальных таблиц, данный механизм разработан 1С. Платформа 1С:Предприятие самостоятельно формирует текст SQL-запроса, в том числе преобразует запрос к виртуальной таблице в сложный SQL-запрос к таблицам СУБД. Таким образом, указание параметров виртуальных таблиц формирует более оптимальный SQL-запрос за счет более ранней фильтрации | Перенести условия в параметры виртуальных таблиц, если от этого не поменяется логика | Для виртуальных таблиц СрезПервых, СрезПоследних регистра сведений может поменяться логика | Важно |
Использование условия ГДЕ вместо условия соединения | Секции условий запросов (ГДЕ, ПО) | Условие в секции соединения будет обработано раньше чем условие секции ГДЕ, таким образом фильтрация произойдет раньше и количество строк, возвращенных после соединения, может быть меньше, что приведет к сокращению времени выполнения следующих операций запроса | Перенести условие из ГДЕ в условие соединения, если от этого не поменяется логика | Если есть соединение запросов и логика конечного запроса не изменится | Рекомендуется |
Использование условия на «НЕ РАВНО» или «НЕ» | Секции условий запросов (ГДЕ, ПО) | Неэффективное использование индекса. Оптимизатор не сможет установить условие отбора по данному полю в индексе | Пересмотреть запрос и постараться уйти от использования данного условия | По необходимости | |
Выполнение преобразований над индексированным полем | Секции условий запросов (ГДЕ, ПО) | Неэффективное использование индекса. Оптимизатор не сможет установить условие отбора по данному полю в индексе |
|
Рекомендуется | |
Отбор по строковому значению | Секции условий запросов (ГДЕ, ПО) | Поиск по строковым столбцам использует индекс только в случае, если используется условие равенства или условие ПОДОБНО «Строка%» | Использовать условие на равенство или ПОДОБНО «Строка%» | Рекомендуется | |
Соединение с подзапросами | Соединения в запросе | Оптимизатор может неверно оценить предполагаемое количество строк и выбрать неоптимальный план запроса | Поместить подзапрос в отдельную временную таблицу | Важно | |
Соединение с виртуальными таблицами | Соединения в запросе | Виртуальная таблица на уровне СУБД представляет из себя вложенный запрос. Оптимизатор может неверно оценить предполагаемое количество строк и выбрать неоптимальный план запроса | Поместить подзапрос в отдельную временную таблицу | Важно | |
Обращение через точку к полям составного типа | Соединения в запросе | Неявное соединение со всеми таблицами составного типа |
|
Важно | |
Сложные запросы, использующие большое количество соединений | Соединения в запросе | Увеличивается время поиска оптимального плана запроса. Может быть не найден оптимальный план запроса за отведенное время. |
|
Важно | |
Неоптимальное использование RLS платформы | Прочие | Усложняется запрос к базе данных путем добавления условия ограничения прав доступа что может привести к неоптимальному выполнению запроса |
|
Рекомендуется | |
Расчет остатков/оборотов по таблицам документов и таблицам движений регистров | Прочие | Для регистров накопления, бухгалтерии в на уровне СУБД создаются таблицы, в которых содержатся итоговые (агрегированные) данные, обращение к которым значительно уменьшает время выполнения запроса | Использовать виртуальные таблицы регистров | Важно | |
Запросы виды ВЫБРАТЬ * ИЗ … | Прочие | Могут тянуться лишние данные, например табличные части или реквизит типа ХранилищеЗначений. Также возможно что на момент написания таких данных не будет, но они могут появиться в дальнейшем | Явно указать поля выбора | Важно | |
Использование ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ, если того не требует задача | Прочие | ОБЪЕДИНИТЬ требует большего количества времени для выполнения, т.к. исключает неуникальные записи | Использовать ОБЪЕДИНИТЬ ВСЕ если логикой не требуется исключение неуникальные записей | Важно | |
При использовании ДЛЯ ИЗМЕНЕНИЯ в автоматическом режиме, не указывать таблицы для блокировки | Прочие | Если не указаны таблицы явно, будут заблокированы все таблицы используемые в запросе | Указать необходимые таблицы для блокировки | Важно | |
Применение избыточного агрегирования в виртуальных таблицах накопления, бухгалтерии | Прочие | Виртуальные таблицы сами агрегируют результат | Не использовать дополнительное агрегирование | Важно | |
Выполнение запросов в цикле, в т.ч. через объектную модель | Прочие | Большое количество-клиент серверных вызовов | Пересмотреть и отказаться | Важно | |
Выполнение запросов через объектную модель | Прочие | Могут тянуться лишние данные т.к. объект читается полностью. При этом если у объекта присутствуют табличные части, чтение будет происходить в транзакции, что может негативно сказаться на параллельности работы | Пересмотреть и отказаться | По необходимости |