内部クエリを減らしてクエリのパフォーマンスを向上させようとしています。SQL Server:内部クエリのパフォーマンスを向上させる
ReasonTUMを返すので、最初のものが必要になります。
しかし、ReasonTUMのケースを使用して番号を返すようにしたいと思います。
どうすればこの問題を解決できますか?元のクエリでmms.sMachineStateName
を参照しようとしましたが、その列は検出されません。
私が考えることができる唯一の別の方法は、別のサブクエリを使用することですが、これはジョインのために300行を返すのに約1分かかることです。
declare @ReportingStart datetime = '20160917 07:00'
declare @ReportingEnd datetime = '20160918 07:00'
SELECT
[sWorkcellDescription]
,[tStart]
,[dDurationSeconds]/60 as Duration_m
,[sStateDescription]
,datepart(hh,tstart) as myHr
,case when convert(time,tstart)< '07:00' then dateadd(dd,-1,convert(date,tstart)) else convert(date,tstart) end as myDate,
cast(dateadd(hour,datepart(hh,tstart),0) as datetime) as dispTime,
(
select top 1 mms.sMachineStateName
from OEEEvent oe
inner join RSBizWare.dbo.OEEConfigEvent ce on oe.lOEEConfigEventId = ce.lOEEConfigEventId
inner join RSBizWare.dbo.OEELOVCodeVal rs on oe.sStartVal = rs.sDescription and ce.lOEEIntRSSqlId=rs.lOEELOVCodeId
inner join RSBizWare.dbo.OEEStateConfig mms on rs.lMachineState = mms.lOEEStateConfigId
where qq.tStart between oe.tStart and oe.tEnd and oe.sPartId='Ore-Hoist'
order by qq.tStart asc
) as ReasonTUM,
(
select top 1 case
when mms.sMachineStateName = 'Production' then '1'
when mms.sMachineStateName = 'Unscheduled Production' then '2'
when mms.sMachineStateName = 'Idle time' then '3'
when mms.sMachineStateName = 'Opportune Maintenance' then '4'
when mms.sMachineStateName = 'Planned External Downtime' then '5'
when mms.sMachineStateName = 'Planned External Downtime' then '5'
when mms.sMachineStateName = 'Planned Maintenance Mechanical' then '5'
when mms.sMachineStateName = 'Planned Maintenance Electrical' then '6'
when mms.sMachineStateName = 'Unplanned Downtime Operational' then '7'
when mms.sMachineStateName = 'Unplanned Downtime Mechanical' then '8'
when mms.sMachineStateName = 'Unplanned Downtime Electrical' then '9'
else '99' end
from OEEEvent oe
inner join RSBizWare.dbo.OEEConfigEvent ce on oe.lOEEConfigEventId = ce.lOEEConfigEventId
inner join RSBizWare.dbo.OEELOVCodeVal rs on oe.sStartVal = rs.sDescription and ce.lOEEIntRSSqlId=rs.lOEELOVCodeId
inner join RSBizWare.dbo.OEEStateConfig mms on rs.lMachineState = mms.lOEEStateConfigId
where qq.tStart between oe.tStart and oe.tEnd and oe.sPartId='Ore-Hoist'
) as rank
FROM
[RSBizWare].[dbo].[OEEQStateData] qq
WHERE
(tstart >= @ReportingStart AND tStart < @ReportingEnd)
AND sWorkcellDescription = 'Hoisting'
AND dDurationSeconds > 5
ORDER BY
tStart ASC
を呼び出さないように? JOINは一般的には1)セットとして実行できない場合(内部クエリをJOIN自身に変換するための簡単な方法)、または2)クエリの適切なインデックスが見つからない場合には、通常遅くなります。 – user2864740
実行計画を読み込みます。 – qxg