我試圖通過減少內部查詢來提高查詢的性能。SQL Server:提高內部查詢的性能
我將需要第一個,因爲它會返回ReasonTUM。
但是,我想使用ReasonTUM的情況下,它也返回一個數字。
我該如何做到這一點?我試過在原始查詢中引用mms.sMachineStateName
,但它沒有檢測到列。
我能想到的唯一方法是使用另一個子查詢,但由於連接,這需要大約1分鐘來返回300行。
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