有人可以帮助优化SQL查询吗
我相当肯定这会产生同样的结果,试试看:有人可以帮助优化SQL查询吗,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我相当肯定这会产生同样的结果,试试看: SELECT RC.Name AS RiskCategory, ( SELECT SUM(CASE WHEN IA.ImpactLevel = 'High' THEN 1 ELSE 0 END) FROM Rpt_ImpactAssess IA JOIN Rpt_Risk R ON IA.FKRiskID = R.RiskID
SELECT RC.Name AS RiskCategory,
( SELECT
SUM(CASE WHEN IA.ImpactLevel = 'High' THEN 1 ELSE 0 END)
FROM
Rpt_ImpactAssess IA
JOIN
Rpt_Risk R
ON
IA.FKRiskID = R.RiskID
WHERE
R.RiskID IN
(
SELECT FKRiskID
FROM
Rpt_Impact
WHERE FKItemID =38
)
AND
R.RiskCatrogry = RC.Name
)AS High_Impact_Risks
From RM_RiskCategories RC
WHERE
RC.Name <> 'All'
GROUP BY
RC.Name
ORder By
RC.Name DESC
试试这个,对不起,如果有语法的话。它肯定会比那个子查询快。还可以尝试创建相关的索引。也知道,哪个表在连接时返回多少行,然后相应地可以在CTR中分解它们。有时它会有帮助。另外,您还可以非常正确地使用sum而不是count
LEFT JOIN Rpt_ImpactAssess IA ON IA.FKRiskID = R.RiskID
WHERE ... AND (R.RiskID IS NULL OR RI.FKItemID = 38)
检查这是否为您提供了预期的结果:
SELECT RC.Name AS RiskCategory,SUM(CASE WHEN IA.ImpactLevel = 'High' THEN 1 ELSE 0 END)High_Impact_Risks
From RM_RiskCategories RC
inner join Rpt_Risk R on R.RiskCatrogry = RC.Name
inner join Rpt_ImpactAssess IA on IA.FKRiskID = R.RiskID
inner join dbo.Rpt_Impact R1 on R.RiskID=R1.FKRiskID and R1.FKItemID =38
WHERE
RC.Name <> 'All'
GROUP BY
RC.Name
ORder By
RC.Name DESC
如果不存在,我建议您检查并添加以下内容:
Rpt_项目ID上的聚集索引
Rpt_RiskId上的聚集索引
RM_RiskCategoriesName上的聚集索引
Rpt_RiskCatrogry上的非聚集索引
Rpt_上的聚集索引
Rpt_ImpactAccessFKRiskID INCLUDEImpactLevel上的非聚集索引
谢谢你的帮助和回答。在您的帮助下,我能够解决以下问题: 选择RC.Name作为风险类别, 当IA.ImpactLevel='High'时的SUMCASE,则1或0结束为High\u Impact\u Risks 从RM_风险类别RC左加入Rpt_风险R 关于R.RiskCatrogry=RC.Name 左连接Rpt_ 关于IA.FKRiskID=R.RiskID 和R.RiskID在一起 选择FKIRSID 从…起 Rpt_影响 其中FKItemID=38 哪里 RC.名称“全部” 分组 RC.名称 订购人
RC.Name DESC您好,我需要从RM_RiskCategories获取所有记录。内部联接仅返回在风险表中链接的相关类别。但我必须显示所有的风险类别,无论是在Rpt_风险表中链接的还是不链接的。是的,这就是我要找的。你检查过执行计划了吗?这将确定真正的问题在哪里。虽然我认为重新写入联接可能会略微提高性能,但SQL Server通常非常擅长识别将相关子查询插入联接的位置。在要求人们尝试优化查询时,请发布您当前的执行计划,如果可能,还请发布一些示例数据。我们不能在黑暗中拍摄。@GarethD和@RachCha说什么,你使用的表上有索引吗?为什么外部查询中有GROUP BY?
SELECT RC.Name AS RiskCategory,SUM(CASE WHEN IA.ImpactLevel = 'High' THEN 1 ELSE 0 END)High_Impact_Risks
From RM_RiskCategories RC
inner join Rpt_Risk R on R.RiskCatrogry = RC.Name
inner join Rpt_ImpactAssess IA on IA.FKRiskID = R.RiskID
inner join dbo.Rpt_Impact R1 on R.RiskID=R1.FKRiskID and R1.FKItemID =38
WHERE
RC.Name <> 'All'
GROUP BY
RC.Name
ORder By
RC.Name DESC
SELECT RC.Name AS RiskCategory,
SUM(CASE WHEN IA.ImpactLevel = 'High' THEN 1 ELSE 0 END) AS High_Impact_Risks
From RM_RiskCategories RC LEFT JOIN Rpt_Risk R
ON R.RiskCatrogry = RC.Name
INNER JOIN Rpt_ImpactAssess IA
ON IA.FKRiskID = R.RiskID
AND R.RiskID IN
(
SELECT FKRiskID
FROM
Rpt_Impact
WHERE FKItemID =38
)
WHERE
RC.Name <> 'All'
GROUP BY
RC.Name
ORder By
RC.Name DESC