有人可以帮助优化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