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

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

Реализовал я следующим образом

select (что-то там)
from Table1 t1 
  outer apply ( select top 1 ......
                      from table2 t2 left join table3 t3
                      where t2.contactId = t1.Id
                         and t2.CreateOn > '20180401'
                      order by t2.CreateOn decs) 


Вьюха в целом то работает. Но каждый запрос занимает 30-50 секунд, что не допустимо.
По плану запросов, основная стоимость падает на сортировку и фильтрацию внутри outer apply
Как это можно оптимизировать, можете подсказать?
14 май 18, 11:03    [21407443]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
aleks222
Member

Откуда:
Сообщений: 919
1. Индекс на table2 (contactId, CreateOn )
2. table3 убрать из outer apply
14 май 18, 11:12    [21407472]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
Oriaraniar,

индексы по CreateOn не особо помогут, т.к. в запросе нечеткое сравнение. Хотя оптимизатор может выбрать скан индекса и это будет в 2-3 раза быстрее.
14 май 18, 16:52    [21408810]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36893
Владислав Колосов
Oriaraniar,

индексы по CreateOn не особо помогут, т.к. в запросе нечеткое сравнение. Хотя оптимизатор может выбрать скан индекса и это будет в 2-3 раза быстрее.
Для выполнения условия на больше-меньше вполне может использоваться Index Seek, поэтому сразу так заявлять преждевременно.

Сообщение было отредактировано: 14 май 18, 17:16
14 май 18, 17:04    [21408841]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
Гавриленко Сергей Алексеевич,

да, для выборки может и помочь, но сортировку не улучшишь.

В таких ситуациях помогают только предварительно вычисленные наборы данных.
14 май 18, 17:42    [21408980]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
aleks222
Member

Откуда:
Сообщений: 919
Владислав Колосов
Гавриленко Сергей Алексеевич,

да, для выборки может и помочь, но сортировку не улучшишь.



Оптимизатор будет использовать сортировку CreateOn.

Ваш КО.
14 май 18, 17:45    [21408989]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
aleks222
Member

Откуда:
Сообщений: 919
Сортировка по CreateOn будет использоваться.
14 май 18, 17:53    [21409010]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Владислав Колосов
Гавриленко Сергей Алексеевич,

да, для выборки может и помочь, но сортировку не улучшишь.

В таких ситуациях помогают только предварительно вычисленные наборы данных.

из вредности будет пересортировывать?
14 май 18, 18:00    [21409034]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
aleks222
Сортировка по CreateOn будет использоваться.

Индекс (contactId, CreateOn ) будет использован при сортировке? Сомнительно что-то.
14 май 18, 18:18    [21409066]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
Ошибался, используется.
14 май 18, 18:35    [21409095]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
idontcare
Member

Откуда:
Сообщений: 7
Oriaraniar, попробуйте такой вариант:

;with cte as
(
select
    t2.contactId,
    rn = row_number() over(partition by t2.contactId order by t2.CreateOn desc),
    ......
from table2 t2
left join table3 t3 on ....
where t2.CreateOn > '20180401'
)
select (что-то там)
from Table1 t1 
    left join cte
    on cte.contactId = t1.id
    and cte.rn = 1
17 май 18, 23:26    [21418971]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
напаркуа тут вообще этот апплай.????
з.ы. ну CTE тоже для красоты чтоли?


select (что-то там)
from Table1 t1
left join (
select
t2.contactId,
rn = row_number() over(partition by t2.contactId order by t2.CreateOn desc) rn
from table2 t2
left join table3 t3 on ....
where t2.CreateOn > '20180401'
) t2 on t2.contactId = t1.Id and t2.rn = 1
18 май 18, 09:53    [21419471]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
idontcare
Member

Откуда:
Сообщений: 7
Ivan Durak,
ну да, для красоты. Не для рекурсии же :)
18 май 18, 11:16    [21419707]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
TaPaK
Владислав Колосов
Гавриленко Сергей Алексеевич,

да, для выборки может и помочь, но сортировку не улучшишь.

В таких ситуациях помогают только предварительно вычисленные наборы данных.

из вредности будет пересортировывать?

если хватает полей ТОЛЬКО из индекса - конечно не будет. А если надо лукапиться в кучу или кластер - это рандом рид. Если есть еще фильтры - может выйти и дешевле.
Например

select * from table
where column1 = 0
order by column2

где по column1 нет индекса т.е. просто фильтр. А по column 2 индекс есть но без include (column2).
И если условие для всех column1 всегда false - то всегда фул скан будет быстре чем индекс скан+lookup в таблицу
18 май 18, 11:16    [21419709]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с производительностью outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Ivan Durak
напаркуа тут вообще этот апплай.????
з.ы. ну CTE тоже для красоты чтоли?


select (что-то там)
from Table1 t1
left join (
select
t2.contactId,
rn = row_number() over(partition by t2.contactId order by t2.CreateOn desc) rn
from table2 t2
left join table3 t3 on ....
where t2.CreateOn > '20180401'
) t2 on t2.contactId = t1.Id and t2.rn = 1


это может быть намоного хуже чем APPLY

автор
если хватает полей ТОЛЬКО из индекса - конечно не будет. А если надо лукапиться в кучу или кластер - это рандом рид. Если есть еще фильтры - может выйти и дешевле.
какие ещё ситуации не относящиеся к теме вы хотите обсудить
18 май 18, 11:18    [21419712]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить