Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация скорости выполнения запроса  [new]
about_job
Member

Откуда:
Сообщений: 43
Здравствуйте!
Коллеги, помогите, пожалуйста, со следующим вопросом :
Имеется запрос вида
SELECT... FROM T1
JOIN T2
...
Выполняется быстро.
Но если я добавляю в перечень выбираем полей выражение вида f=(select f1 from T2 where T2.f2=T1.f2), то скорость выполнения запроса резко увеличивается.
Количество записей в результате запроса невелико и очевидно, что оптимально для сервера будет посчитать вычисляемое поле после выполнения основного запроса.
Но сервер, похоже, вычисляет это поле на этапе соединения таблиц, когда таких записей много.
25 ноя 15, 08:07    [18468708]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
about_job,

Приджойниете еще раз t2 cнизу, ну иои приэплите. И сравните планы
25 ноя 15, 09:11    [18468839]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
about_job
Но сервер, похоже, вычисляет это поле на этапе соединения таблиц, когда таких записей много.

Это вы увиденный план выполнения пересказываете ? Или просто фантазируете, как это могло бы быть ?

about_job
Но если я добавляю в перечень выбираем полей выражение вида f=(select f1 from T2 where T2.f2=T1.f2),

Вы же уже сделали JOIN T2 ? Для чего нужен еще один from T2 ?
25 ноя 15, 09:34    [18468906]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
about_job
очевидно, что оптимально для сервера будет посчитать вычисляемое поле после выполнения
У вас ещё и вычисляемые поля есть? Или вы так называете второй джойн второго экземпляра Т2?
25 ноя 15, 10:01    [18469040]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
about_job
Member

Откуда:
Сообщений: 43
Прошу прощения, для f используется таблица t3.
Не могу скопировать запрос, т.к. Комп не в Инете.
Решил по топорному :
Сделал в виде 2-х запросов со временной таблицей. Один основной, второй выбирает все поля из временной таблицы и считает вычисляемое поле.
25 ноя 15, 10:04    [18469052]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
about_job
Решил по топорному :
JOIN с таблицей T3 будет так же эффективен, что и подзапрос, т.к. результат подзапроса возвращает одну запись.

И то, и другое обычно не хуже, чем выборка во временную таблицу, если, конечно, у вас не очень сложный запрос/сложные условия выборки.
Но нужно, что бы сервер мог построить правильный план запроса.

Вам нужно было начать с обновления статистики.
25 ноя 15, 11:43    [18469819]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
about_job
Member

Откуда:
Сообщений: 43
Выборка во временную таблицу оказалась в сотни раз быстрее, чем подзапрос.
Если быть, конечно, точным до конца, то в поле выбиралось значение t3.f1, у которого максимальное f5 и f2= T1.f2.
То есть имел место подзапрос в подзапросе (для получения и максимального элемента) .
29 ноя 15, 20:42    [18488763]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация скорости выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
about_job
То есть имел место подзапрос в подзапросе (для получения и максимального элемента) .

Вы план выполнения то видели или нет ?
29 ноя 15, 20:45    [18488770]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить