我和group-by-causing-a-huge-increase-in-query-execution-time有同样的问题。我将中间结果推送到表变量(如果我使用临时表没有区别)并声明一个适当的Clustered Index与我的group by子句相关,即
INDEX IX1 CLUSTERED (ContractID, Odometer DESC, FuelTranDate DESC)
查询结果大约需要8秒。但是,只要我在GROUP BY子句中使用结果(请参阅下面的示例),查询就会永远存在。查询的目的是检查燃料数据输入差异。
SELECT * FROM @Fuel --8 secs to run.
添加GROUP BY子句:
;WITH CTEFuelDate_YearMonthPreviousRow AS (
SELECT *, Year(FuelTranDate) AS FuelTranYr, Month(FuelTranDate) AS FuelTranMn,
ROW_NUMBER() OVER (PARTITION BY ContractID ORDER BY Odometer DESC, FuelTranDate DESC) AS RowNumberPerContract
FROM @Fuel
), CTE0 AS (
SELECT curr.*,
prev.FuelTranDate AS prevFuelTranDate,
prev.Odometer AS prevOdometer,
prev.Quantity AS prevQuantity,
curr.Odometer - prev.Odometer AS OdometerDifferential
FROM CTEFuelDate_YearMonthPreviousRow curr
JOIN CTEFuelDate_YearMonthPreviousRow prev ON curr.ContractID = prev.ContractID AND curr.RowNumberPerContract + 1 = prev.RowNumberPerContract
)
SELECT ContractID, Avg(OdometerDifferential) As AvgOdometerDifferential, StDevP(OdometerDifferential) AS StDevPOdometerDifferential
FROM CTE0
GROUP BY ContractID
您是否需要执行计划作为屏幕截图或xml?