У меня есть два следующих запроса: первый - первый, а второй - мое небольшое «обновление».Для запуска первого требуется почти секунда, а для второго - прежде чем я могу полностью убрать палец с кнопки обновления.
Мой вопрос: почему?
Единственная разница между первым и вторымявляется то, что первый использует coalesce, чтобы получить значение для сравнения berp.ID_PART_SESSION, а второй использует объединение, чтобы соединить два оператора select для достижения одной и той же цели.
Я все еще думаю, что первый должен быть быстрее (первоначальная причина, по которой я использовал coalesce), поскольку кажется, что для достижения того же результата нужно потратить меньше времени.Учитывая, насколько слабо я расшифровываю планы выполнения, кто-нибудь может объяснить, почему второй запрос намного лучше первого?
declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
AND berp.PRINCIPAL = 1
AND berp.DELETED = 0
AND berp.CANCELLED = 0
AND berp.ID_PART_SESSION = (
select coalesce(pss.ID_PART_SESSION, psst.ID_PART_SESSION)
from t_bersp b
LEFT JOIN T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
LEFT JOIN T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
where ID_BERSP = 4040)
против
declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM dbo.T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
AND berp.PRINCIPAL = 1
AND berp.DELETED = 0
AND berp.CANCELLED = 0
AND berp.ID_PART_SESSION IN (
select pss.ID_PART_SESSION
from dbo.t_bersp b
LEFT JOIN dbo.T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
where ID_BERSP = 4040
union
select psst.ID_PART_SESSION
from dbo.t_bersp b
LEFT JOIN dbo.T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
where ID_BERSP = 4040)