Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с производительностью outer apply / 15 сообщений из 15, страница 1 из 1
14.05.2018, 11:03
    #39644257
Oriaraniar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Добрый день.
Есть 2 таблицы со связью один ко многим. Нужно создать вьюху, где выводятся последняя запись к каждой записи опорной таблицы. Последняя запись определяется сортировкой по столбцу с датой создания. Плюс есть условия, что выводиться должны только строки после определенной даты.
Ну и при вызове с этой вьюхи накладываются внешние условия.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
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
Как это можно оптимизировать, можете подсказать?
...
Рейтинг: 0 / 0
14.05.2018, 11:12
    #39644267
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
1. Индекс на table2 (contactId, CreateOn )
2. table3 убрать из outer apply
...
Рейтинг: 0 / 0
14.05.2018, 16:52
    #39644536
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Oriaraniar,

индексы по CreateOn не особо помогут, т.к. в запросе нечеткое сравнение. Хотя оптимизатор может выбрать скан индекса и это будет в 2-3 раза быстрее.
...
Рейтинг: 0 / 0
14.05.2018, 17:04
    #39644546
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Владислав КолосовOriaraniar,

индексы по CreateOn не особо помогут, т.к. в запросе нечеткое сравнение. Хотя оптимизатор может выбрать скан индекса и это будет в 2-3 раза быстрее.Для выполнения условия на больше-меньше вполне может использоваться Index Seek, поэтому сразу так заявлять преждевременно.
...
Рейтинг: 0 / 0
14.05.2018, 17:42
    #39644566
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Гавриленко Сергей Алексеевич,

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

В таких ситуациях помогают только предварительно вычисленные наборы данных.
...
Рейтинг: 0 / 0
14.05.2018, 17:45
    #39644571
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Владислав КолосовГавриленко Сергей Алексеевич,

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



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

Ваш КО.
...
Рейтинг: 0 / 0
14.05.2018, 17:53
    #39644576
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Сортировка по CreateOn будет использоваться.
...
Рейтинг: 0 / 0
14.05.2018, 18:00
    #39644586
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Владислав КолосовГавриленко Сергей Алексеевич,

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

В таких ситуациях помогают только предварительно вычисленные наборы данных.
из вредности будет пересортировывать?
...
Рейтинг: 0 / 0
14.05.2018, 18:18
    #39644599
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
aleks222Сортировка по CreateOn будет использоваться.
Индекс (contactId, CreateOn ) будет использован при сортировке? Сомнительно что-то.
...
Рейтинг: 0 / 0
14.05.2018, 18:35
    #39644608
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Ошибался, используется.
...
Рейтинг: 0 / 0
17.05.2018, 23:26
    #39646418
idontcare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Oriaraniar, попробуйте такой вариант:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
;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
...
Рейтинг: 0 / 0
18.05.2018, 09:53
    #39646539
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
напаркуа тут вообще этот апплай.????
з.ы. ну 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
...
Рейтинг: 0 / 0
18.05.2018, 11:16
    #39646585
idontcare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
Ivan Durak,
ну да, для красоты. Не для рекурсии же :)
...
Рейтинг: 0 / 0
18.05.2018, 11:16
    #39646586
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
TaPaKВладислав КолосовГавриленко Сергей Алексеевич,

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

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

select * from table
where column1 = 0
order by column2

где по column1 нет индекса т.е. просто фильтр. А по column 2 индекс есть но без include (column2).
И если условие для всех column1 всегда false - то всегда фул скан будет быстре чем индекс скан+lookup в таблицу
...
Рейтинг: 0 / 0
18.05.2018, 11:18
    #39646587
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с производительностью outer apply
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

авторесли хватает полей ТОЛЬКО из индекса - конечно не будет. А если надо лукапиться в кучу или кластер - это рандом рид. Если есть еще фильтры - может выйти и дешевле.
какие ещё ситуации не относящиеся к теме вы хотите обсудить
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с производительностью outer apply / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]