我有一個查詢SQL查詢如下,任何人都可以爲此提出任何優化;我認爲聯盟行動的大部分工作正在進行 - 是否還有其他方法可以獲得相同的結果? 基本上我想查詢UNION的第一部分,如果每條記錄都沒有結果,那麼需要運行第二部分。請幫忙。 :如何優化SQL查詢?
SET dateformat dmy;
WITH incidentcategory
AS (
SELECT 1 ord, i.IncidentId, rl.Description Category FROM incident i
JOIN IncidentLikelihood l ON i.IncidentId = l.IncidentId
JOIN IncidentSeverity s ON i.IncidentId = s.IncidentId
JOIN LikelihoodSeverity ls ON l.LikelihoodId = ls.LikelihoodId AND s.SeverityId = ls.SeverityId
JOIN RiskLevel rl ON ls.RiskLevelId = rl.riskLevelId
UNION
SELECT 2 ord, i.incidentid,
rl.description Category
FROM incident i
JOIN incidentreportlikelihood l
ON i.incidentid = l.incidentid
JOIN incidentreportseverity s
ON i.incidentid = s.incidentid
JOIN likelihoodseverity ls
ON l.likelihoodid = ls.likelihoodid
AND s.severityid = ls.severityid
JOIN risklevel rl
ON ls.risklevelid = rl.risklevelid
) ,
ic AS (
SELECT ROW_NUMBER() OVER (PARTITION BY i.IncidentId ORDER BY (CASE WHEN incidentTime IS NULL THEN GETDATE() ELSE incidentTime END) DESC,ord ASC) rn,
i.incidentid,
dbo.Incidentdescription(i.incidentid, '',
'',
'', '')
IncidentDescription,
dbo.Dateconverttimezonecompanyid(closedtime,
i.companyid)
ClosedTime,
incidenttime,
incidentno,
Isnull(c.category, '')
Category,
opencorrectiveactions,
reportcompleted,
Isnull(classificationcompleted, 0)
ClassificationCompleted,
Cast ((CASE
WHEN closedtime IS NULL THEN 0
ELSE 1
END) AS BIT)
IncidentClosed,
Cast ((CASE
WHEN investigatorfinishedtime IS NULL THEN 0
ELSE 1
END) AS BIT)
InvestigationFinished,
Cast ((CASE
WHEN investigationcompletetime IS NULL THEN 0
ELSE 1
END) AS BIT)
InvestigationComplete,
Cast ((CASE
WHEN investigatorassignedtime IS NULL THEN 0
ELSE 1
END) AS BIT)
InvestigatorAssigned,
Cast ((CASE
WHEN (SELECT Count(*)
FROM incidentinvestigator
WHERE incidentid = i.incidentid
AND personid = 1588
AND tablename = 'AdminLevels') = 0
THEN 0
ELSE 1
END) AS BIT)
IncidentInvestigator,
(SELECT dbo.Strconcat(osname)
FROM (SELECT TOP 10 osname
FROM incidentlocation l
JOIN organisationstructure o
ON l.locationid = o.osid
WHERE incidentid = i.incidentid
ORDER BY l.locorder) loc)
Location,
Isnull((SELECT TOP 1 teamleader
FROM incidentinvestigator
WHERE personid = 1588
AND tablename = 'AdminLevels'
AND incidentid = i.incidentid), 0)
TeamLeader,
incidentstatus,
incidentstatussearch
FROM incident i
LEFT OUTER JOIN incidentcategory c
ON i.incidentid = c.incidentid
WHERE i.isdeleted = 0
AND i.companyid = 158
AND incidentno <> 0
--AND reportcompleted = 1
--AND investigatorassignedtime IS NOT NULL
--AND investigatorfinishedtime IS NULL
--AND closedtime IS NULL
),
ic2 AS (
SELECT * FROM ic WHERE rn=1
)
SELECT * FROM ic2
--WHERE rownumber >= 0
-- AND rownumber < 0 + 10
--WHERE ic2.incidentid in(53327,53538)
--WHERE ic2.incidentid = 53338
ORDER BY incidentid DESC
以下是執行計劃我: https://www.dropbox.com/s/50dcpelr1ag4blp/Execution_Plan.sqlplan?dl=0
你**覺得**大部分努力都在聯盟中,但你可以肯定地發現,如果你告訴SSMS向你展示[執行計劃](http://technet.microsoft.com/en-我們/庫/ ms178071%28V = SQL.105%29.aspx)。沒有更多信息,這類問題通常無法回答。模式,索引和/或理想的[sqlfiddle](http://sqlfiddle.com)顯示問題將幫助我們幫助您。 – Dan 2014-08-29 05:15:55
這是一個查詢的問題。 – radpin 2014-08-29 05:18:12
理想情況下,你應該做一個簡單的例子,就像你的情況,並把它放在這裏,而不是給我們整個查詢。 – 2014-08-29 05:23:17