【问题标题】:Is there a way to improve performance of this query (aggregation)有没有办法提高这个查询的性能(聚合)
【发布时间】:2019-08-21 18:18:34
【问题描述】:

这里是查询:

SELECT  sdd.CompanyID 
            ,sdd.ClassID 
            ,sdd.PeriodID, SUM(sdd.Volume) AS VolumeTotal, SUM(sdd.Dollars) AS DollasTotal
            ,COUNT(LogID) as LogIDCount

    FROM (SELECT dp.CompanyID 
                ,ds.ClassID 
                ,fs.PeriodID, fs.LogID, sum(fs.Volume) AS Volume,sum(fs.Dollars) AS Dollars
    FROM DW.FactSupplyDataDetail fs     WITH (NOLOCK)
        JOIN DW.DimPLProvider dp    WITH (NOLOCK) 
            ON fs.PLProviderID = dp.PLProviderID
        JOIN DW.DimSupply ds    WITH (NOLOCK) 
            ON fs.SupplyID = ds.SupplyID
        WHERE fs.PeriodID between 201901 and 201907
        GROUP BY dp.CompanyID 
                ,ds.ClassID 
                ,fs.PeriodID,fs.LogID) sdd
    GROUP BY sdd.CompanyID 
            ,sdd.ClassID 
            ,sdd.PeriodID

这里是查询的执行计划:

https://www.brentozar.com/pastetheplan/?id=rkoxSEjEH

DW.FactSupplyDataDetail has 10590237 records
DW.DimPLProvider has 5071 records
DW.DimSupply has 81001 records

result of a query is 1992094

【问题讨论】:

标签: sql-server performance sql-server-2016


【解决方案1】:

检查一下

  1. 表 FactSupplyDataDetail 的索引从 PeriodID 开始
  2. 表 DimSupply 的索引从 SupplyID 开始
  3. 表 DimPLProvider 的索引从 PLProviderID 开始

表 TABLE 的索引从列 COLUMN 开始意味着您将索引 (idx_xxx_) 定义为:

在 TABLE(COLUMN、其他一些列或空列表)上创建索引 idx_xxx;

【讨论】:

  • FactSupplyDataDetail 表有一个以 PeriodID 开头的索引。 SupplyID 是 DimSupply 表中的 PK,PLProviderID 是 DimPLProvider 中的 PK,因此两者都有一个带有 *ID 列的聚集索引。
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 2021-08-02
  • 2020-05-06
  • 2020-12-01
  • 2019-01-25
  • 2021-09-06
  • 2022-11-07
  • 1970-01-01
相关资源
最近更新 更多