【发布时间】:2021-06-29 12:02:48
【问题描述】:
以下 SQL Server 查询:
SELECT DISTINCT NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0) as dt_hour
,AVG(Availability)
OVER (PARTITION BY NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0)) AS avg
,PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY Availability)
OVER (PARTITION BY NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0)) AS perc90
,MAX(Availability)
OVER (PARTITION BY NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0)) AS max
FROM InterfaceAvailability_CS_Detail_hist
order by NodeID, dt_hour;
运行时间大约是这个的 3 倍:
SELECT DISTINCT NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0) as dt_hour
,PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY Availability)
OVER (PARTITION BY NodeID, dateadd(hour, datediff(hour, 0, Timestamp), 0)) AS perc90
FROM InterfaceAvailability_CS_Detail_hist
order by NodeID, dt_hour;
我怀疑它对每个聚合(AVG、PERCENTILE_CONT、MAX)都进行了冗余分区。有没有办法只编写一次OVER 子句并将其应用于每个聚合?
【问题讨论】:
-
使用
OVER子句的函数不是聚合函数... -
Edit问题并提供minimal reproducible example,即表和索引的
CREATE语句(粘贴文本,不要使用图像),INSERT用于示例数据 (dito) 的语句、表格文本格式的示例数据的期望结果以及您的查询的当前计划。 -
"OVER 子句可能跟在所有聚合函数后面" - https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql
-
@MarkPundurs,使用多余的
PARTITION BY子句不一定会导致执行多余的工作。你能分享你的查询计划吗? -
几乎可以肯定是
DISTINCT给您带来了问题。为什么它首先存在,从外观上看,你真的想要一个具有正常聚合的GROUP BY。完全相同的PARTITION BY多次几乎肯定不会多次计算分区,只有实际函数会
标签: sql-server tsql aggregate-functions