我有一个查询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