次の 2 つのクエリがあります。元のクエリは 1 つ目で、2 つ目はわずかな「アップグレード」です。最初の実行には 1 秒近くかかり、2 番目の実行は更新ボタンから指を完全に離す前に終了します。
私の質問: なぜですか?
1 つ目と 2 つ目の唯一の違いは、1 つ目は 合体 を使用して berp.ID_PART_SESSION と比較する値を取得し、2 つ目はユニオンを使用して 2 つの select ステートメントをまとめて同じことを実行することです。
同じ結果を得るために少ない作業を行う必要があるように見えるため、最初のものはより高速である必要があると思います (合体を使用した元の理由)。実行計画の解読がいかに弱いかを考えると、2番目のクエリが最初のクエリよりもはるかに優れている理由を誰か説明してもらえますか?
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)