簡體   English   中英

加快SQL Server中的累積總和計算

[英]Speeding up cumulative sum calculation in SQL Server

作為一些解決方案構建的一部分,我必須實現一個正在執行總計(累計和計算)的視圖。 我采用了最簡單,最基本的方法來將表與具有日期列表的表連接起來,但看來視圖仍然相當慢。 即使表本身只有約15K行,在表上添加索引也無濟於事。 我想知道是否有人可以建議哪種方法可以加快速度?

有幾個注意事項:

  1. 我需要計算截至特定ProjectIDContractorID的日期的累計總和。 因此對於同一日期,我可能會有很多ProjectID和ContractorId組合,但是Date,ProjectID和ContractorID的組合始終是唯一的

  2. 有一個包含日期,項目編號(但沒有合同編號)的主表,並且在此主日期表中,我需要每個日期的累積總和,項目編號

  3. 我需要同時計算幾列的總和,而不僅僅是一列

為了讓您稍微了解一下情況,我提供的表格是:

  • dbo.Project_Reporting_Schedule ,其中包含projectid,日期的主列表。 對於每種組合,我都需要根據另一張表計算累計和。 請注意,它沒有承包商!

  • Project_value_delivery是一張表,其中有一些實際值列用於執行累積總和計算。 它有自己的日期集,該日期集可能與Project_Reporting_Schedule中的日期匹配,也可能不匹配,因此我們不能僅將表格本身連接起來。 另請注意,它具有Contractorid!

目前,我有以下選擇,這是不言自明的,只是將表與具有主日期列表的表中的值連接起來並進行求和。 Select可以正常工作,但是即使只有15K記錄,它也需要花費近5秒鍾來運行,這相當慢。

select 
    pv2.ProjectID,
    pv2.ContractorID,
    pv1.Date, 
    sum(pv2.ValuePlanned) as PlannedCumulative, 
    sum(pv2.ValueActual) as ActualCumulative,
    sum(pv2.MobilizationPlanned) as MobilizationPlanned,
    sum(pv2.MobilizationActual) as MobilizationActual,
    sum(pv2.EngineeringPlanned) as EngineeringPlanned,
    sum(pv2.EngineeringActual) as EngineeringActual,
    sum(pv2.ProcurementPlanned) as ProcurementPlanned,
    sum(pv2.ProcurementActual) as ProcurementActual,
    sum(pv2.ConstructionPlanned) as ConstructionPlanned,
    sum(pv2.ConstructionActual) as ConstructionActual,
    sum(pv2.CommisioningTestingPlanned) as CommisioningTestingPlanned,
    sum(pv2.CommisioningTestingActual) as CommisioningTestingActual
from 
    dbo.Project_Reporting_Schedule as pv1
join 
    dbo.Project_value_delivery as pv2 on pv1.Date >= pv2.Date and pv1.ProjectID = pv2.ProjectID
group by 
    pv2.ProjectID, pv2.ContractorID, pv1.Date

更新

為了進一步說明,我將執行計划放在此處: https : //www.brentozar.com/pastetheplan/?id=H12t-O1PS

創建的索引是相同的,在兩個表上我都有Projectid,Date組合以及ProjectID和Date列上的獨立索引。

所有索引在適用情況下都是唯一非聚集索引,或在適用情況下僅是非聚集索引。

我們可以看到它執行了“非聚集索引查找”,這花費了大部分執行時間。 也許指數需要調整?

JOIN子句中取出比較並將其移至WHERE子句:

select 
       pv2.ProjectID,
       pv2.ContractorID,
       pv1.Date, 
       sum(pv2.ValuePlanned) as PlannedCumulative, 
       sum(pv2.ValueActual) as ActualCumulative,
       sum(pv2.MobilizationPlanned) as MobilizationPlanned,
       sum(pv2.MobilizationActual) as MobilizationActual,
       sum(pv2.EngineeringPlanned) as EngineeringPlanned,
       sum(pv2.EngineeringActual) as EngineeringActual,
       sum(pv2.ProcurementPlanned) as ProcurementPlanned,
       sum(pv2.ProcurementActual) as ProcurementActual,
       sum(pv2.ConstructionPlanned) as ConstructionPlanned,
       sum(pv2.ConstructionActual) as ConstructionActual,
       sum(pv2.CommisioningTestingPlanned) as CommisioningTestingPlanned,
       sum(pv2.CommisioningTestingActual) as CommisioningTestingActual
       FROM
       dbo.Project_Reporting_Schedule as pv1
       join dbo.Project_value_delivery as pv2 on pv1.ProjectID = pv2.ProjectID
       WHERE pv1.Date >= pv2.Date
       GROUP BY pv2.ProjectID, pv2.ContractorID, pv1.Date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM