Sql server 如何优化此查询?I';ve对同一个表使用两个内部联接(SQL Server)

Sql server 如何优化此查询?I';ve对同一个表使用两个内部联接(SQL Server),sql-server,Sql Server,在这种情况下,有没有办法避免对同一个表进行两次内部联接 SELECT B.CostCatCd As CostCatCd, F.CountryDesc AS SenderCountry, B.SenderCompanycd AS SenderCompanyCd, D.CountryDesc As ReceivingCountry, B.BillCompanycd AS ReceivingCom

在这种情况下,有没有办法避免对同一个表进行两次内部联接

    SELECT  B.CostCatCd As CostCatCd,
            F.CountryDesc AS SenderCountry,
            B.SenderCompanycd AS SenderCompanyCd,
            D.CountryDesc As ReceivingCountry,
            B.BillCompanycd AS ReceivingCompanyCd,  
            SUM(B.BillAmt) as Amount

    FROM    Bill B      
    INNER JOIN  Company C
    ON          B.FY = C.FY
    AND         B.CycleCd = C.CycleCd
    AND         B.BillCompanyCd = C.CompanyCd
    INNER JOIN  Country D
    ON          B.FY = D.FY
    AND         B.CycleCd = D.CycleCd
    AND         C.CountryCd = D.CountryCd
    INNER JOIN  Company E
    ON          B.FY = E.FY
    AND         B.CycleCd = E.CycleCd
    AND         B.SenderCompanyCd = E.CompanyCd
    INNER JOIN  Country F
    ON          B.FY = F.FY
    AND         B.CycleCd = F.CycleCd
    AND         E.CountryCd = F.CountryCd
我正在努力提高SP的性能,也许这是可以更新的。我对这两张表(公司和国家)都有同样的担心


提前谢谢

如果没有详细信息,给出建议就不那么简单了,但是您应该查看实际的查询计划和统计IO输出。这些很好地说明了SQL的情况

如果查询运行缓慢,则应检查以下事项:

  • 具有最大逻辑读取的表
  • 查询计划中的扫描
  • 在查询计划中查找大量行时的键
  • 线轴、分类、溢出到临时数据库中
对于索引,似乎索引的一个很好的候选者是:

公司:CompanyCd、CycleCd、FY(+CountryCd作为包含列)

国家/地区:CountryCd、CycleCd、FY(+CountryDesc作为包含列)

当然,一切都取决于行的更新频率,因为索引会使更新速度减慢(稍微慢一点),但猜测公司或国家不会得到很多更新。我对列的选择性做了一个猜测,这就是为什么索引中的列是按顺序排列的


正确地为账单编制索引也是一个好主意,但由于缺少where子句,因此无法提供任何建议。

您的查询缺少group by。您是否尝试过在不使用company表的情况下进行查询?由于存在从B到D和B到F的连接条件,是否有必要查看表C和表E中没有从这些表返回列的查询?@JBKing您打算如何在没有公司的情况下选择国家/地区信息?请对联接尝试以下操作:B.FY=D.FY上的内部联接国家/地区D和B.CycleCd=D.CycleCd B.FY上的内部联接国家/地区F=F.FY和B.CycleCd=F.CycleCd“在这种情况下,我有没有办法避免对同一个表执行两个内部联接?”如果不以可能不会有改进的方式更改您的模式,则不能这样做。对于公司表:有:-3个PK(FY,CycleCd和CompanyCd)-1个带FY,CycleCd和CompanyCd的聚集索引。-1个带有FY、CycleCd、CompanyCd、CountryCd的非聚集索引。对于国家/地区表:-3 PK(FY、CycleCd和CountryCd)-1个带FY、CycleCd和CountryCd的聚集索引如果你的聚集索引已经有FY、CycleCd和CompanyCD/CountryCd,那么其他索引很可能没有帮助,但是更改索引中列的顺序可能会有所帮助,假设CompanyCD/CountryCD是限制行数最多的