如何优化此查询?我要为同一个表使用两个INNER JOIN(SQL Server)

时间:2015-10-19 16:28:03

标签: sql-server

在这种情况下,有什么办法可以避免为同一张桌子做两次INNER JOIN吗?

    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的性能,也许这可能会更新。我对两个表(公司和国家)都有同样的担忧。

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果没有详细信息,提供建议并不是那么简单,但您应该查看实际的查询计划和统计IO输出。那些可以很好地了解你的SQL是怎么回事。

如果查询运行缓慢,您应该检查以下内容:

  • 具有最大逻辑读数的表
  • 扫描查询计划
  • 查询计划中的大量行发生时的键查找
  • Spools,Sorts,Spills into temp db

对于索引,它似乎是索引的一个很好的候选者:

公司:CompanyCd,CycleCd,FY(+ CountryCd as included column)

国家/地区:CountryCd,CycleCd,FY(+ CountryDesc as included column)

当然,一切都取决于行的更新频率,因为索引会缓慢(略微),但猜测公司或国家/地区不会获得更多更新。我猜测了列的选择性,这就是索引中列的顺序。

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