この例では、作業しているテーブルが2つしかありません。どちらがより高速に実行され、実行プランが同じであるかを確認していました。これらのクエリの目的は、あるレコードに関連付けられている、別のレコードの最大日付よりも大きい最小日付を見つけることです。最初のクエリはより簡潔です(ただしDATEDIFF
、2番目のクエリでは列が許可されません)。2番目の方法でクエリを作成すると、長期的には、おそらく多くの結合がある場合に、パフォーマンスの面でよりコストがかかるように感じます。どの方法についての一般的なルールはありますか、それともケースバイケースのシナリオであり、オプティマイザーにそれを実行させますか?
最初
select c.patid,min(c.admitDate) as minDiabetesDate
from clm_extract as c
inner join icdClm as ic on ic.clmid=c.clmid
where ic.icd like '250%'
group by c.patid
having min(c.admitdate) >
(
select MAX(c2.admitDate) as maxPreDiabetesDate
from clm_extract as c2
inner join icdClm as ic2 on ic2.clmid = c2.clmid
where ic2.icd ='79029' and c2.patid=c.patid
group by c2.patid
)
2番目
select distinct x.patid,x.minDiabetesDate,y.maxPreDiabetesDate
from
(
select c.patid, min(c.admitdate) as minDiabetesDate
from clm_extract as c
inner join icdClm as ic on ic.clmid=c.clmid
where ic.icd like '250%'
group by c.patid
)x
inner join
(
select c2.patid, MAX(c2.admitdate) as maxPreDiabetesDate
from clm_extract as c2
inner join icdClm as ic2 on ic2.clmid=c2.clmid
where ic2.icd ='79029'
group by c2.patid
)y on x.patid=y.patid
group by x.minDiabetesDate,y.maxPreDiabetesDate,x.patid
having DATEDIFF(dd,y.MaxPreDiabetesDate,x.minDiabetesDate) > 0