HelpF.pro

Оптимизация запросов

Почему запрос может работать неоптимально:
1. в виртуальных таблицах не используются параметры
2. соединения с подзапросами, условия с подзапросами, вложенные подзапросы
3. соединения с виртуальными таблицами
4. наложение условий на неиндексированные поля
5. получение данных из составного типа через точку
6. использование вложенных подзапросов (с большой вложенностью)

Подробнее:
1. В виртуальных таблицах не используются параметры
Рекомендация
Надо использовать по-максимуму параметры виртуальных таблиц (Остатки, Обороты, ОстаткиИОбороты)
Объяснение
Сперва выбираются данные для виртуальных таблиц, а потом уже на них накладываются условия, соединения и т.д. Т.е. если сделать запрос:
Код 1C v 8.х
 ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ГДЕ
ТоварыНаСкладахОстатки.Склад = &Склад

То сперва выберется вся имеющаяся номенклатура со всеми остатками, а потом на неё наложится условие склада. Надо так:
Код 1C v 8.х
 ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки


2. Соединения с подзапросами, условия с подзапросами, вложенные подзапросы
Рекомендация
Надо вообще стараться не использовать подзапросы, а переписать их во временные таблицы. Соединять следует только объекты метаданных или временные таблицы.
Объяснение
Оптимизатор СУБД часто не может составить оптимальный план выполнения таких запросов. Проблема в определении алгоритма соединения, который зависит от количества записей в выборке. При использовании временных таблиц размер выбираемых таблиц известен заранее, поэтому СУБД легче составить оптимальный план выполнения. Но при этом появляются накладные расходы на создание временных таблиц.

3. Соединения с виртуальными таблицами
Рекомендация
Перед соединениями с виртуальными таблицами их следует предварительно выбрать во временные и соединять уже с ними.
Объяснение
Виртуальные таблицы часто содержатся в нескольких физических таблицах СУБД, в итоге для их выборки составляется подзапрос, а проблемы с ним расшифрованы в п.2.

4. Наложение условий на неидексированные поля
Рекомендация
Для условий запросов должны существовать подходящие индексы.
При соединении с виртуальными таблицами, их необходимо проиндексировать по полям, участвующим в соединении.
Объяснение
При отсутствии подходящего индекса СУБД будет сканировать всю таблицу для соединения по каждому полю.

5. Получение данных из составного типа через точку

Рекомендация
В запросах использовать ВЫРАЗИТЬ(... КАК ...), в описании типов полей указывать только необходимые типы.
Объяснение
При выполнении запроса для составного типа без ВЫРАЗИТЬ будет происходить соединение с таблицами всех объектов, входящих в составной тип.
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/1144.html