CTE против временной таблицы в SSMS - PullRequest
0 голосов
/ 03 июля 2019

Я работаю над оптимизацией запроса, который имеет 3 внутренних соединения и 5 левых.Я столкнулся с давним вопросом использования нескольких CTE или нескольких временных таблиц, чтобы минимизировать время, необходимое для возврата результатов в мое приложение.Я посмотрел на многие ответы в Stack и других местах, но у меня просто нет достаточно близкого вопроса к тому, с чем я имею дело.Вот некоторый псевдокод, чтобы показать, с чем я работаю в начале:

Declare @from_date datetime = '4/1/2019'
,@to_date datetime = '4/30/2019'

select * from tableA  as a 
inner join tableB as b on b.c_id = a.c_id
inner join tableC as c on c.id = a.c_id
left JOIN tableD as d on d.user_id = a.user_id 
left JOIN tableE as e on e.id = c.e_id
left JOIN tableF as f on f.id = b.f_id
left JOIN tableG as g on g.id = c.g_id
left JOIN tableH as h on h.id = b.h_id
left JOIN tableI as i on a.id = i.a_id
where a.create_date between @from_date and @to_date
and b.valid_flag = convert(bit,1)

Существует большой раздел для предложения where, но он очень мало влияет на план выполнения.При запуске в моей БД эта версия кода занимает около 45 секунд, чтобы вернуть 30-дневный промежуток времени.

Когда я разделяю два объединения на CTE, такие как:

Declare @from_date datetime = '4/1/2019'
,@to_date datetime = '4/30/2019'

WITH modA (AId, User_Id, CId, CreateDate)
as (Select id [Aid]
, user_id [User_Id]
, c_id [CId]
, create_date [CreateDate]
from tableA where 
create_date between @from_date and @to_date),
modB (CId, FId, HId)
as (Select c_id [CId]
, f_id [FId]
, h_id [HId]
from tableB 
where valid_flag = convert(bit,1))

Select * 
from modA as a
Join modB as b on b.CId = a.CId
inner join tableC as c on c.id = a.CId
left JOIN tableD as d on d.user_id = a.User_Id
left JOIN tableE as e on e.id = c.e_id
left JOIN tableF as f on f.id = b.FId
left JOIN tableG as g on g.id = c.g_id
left JOIN tableH as h on h.id = b.HId
left JOIN tableI as i on a.Id = i.a_id

Эта версия сокращает время запуска до 2 секунд, что, я думаю, замечательно.Теперь, если я преобразовываю CTE во временные таблицы, время выполнения увеличивается до 7 секунд, но план выполнения выглядит более скомпилированным.

Какие риски я подвергаю, если оставить CTE по сравнению с реализацией запроса с временными таблицами?Есть ли недостаток, который стоит добавленных 5 секунд?Если вам нужна дополнительная информация, пожалуйста, спросите.Я благодарен всем, кто прочитал это далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...