表的总和,按表分区分组

时间:2019-05-23 11:17:58

标签: sql sql-server sql-server-2008

我有一个表,其中包含每日指标:

|DateID   | Metric1 | Metric2|
 20190501      24       34
 20190502      25       56 
 .....        ....     ....

该表有超过1.5亿行。它每月按DateID进行分区(每个分区保存从月初到下月初的DateID的行)。我的一些分区:

rows    pages   comparison  value
4205460 174009  less than   20180801
4205460 174097  less than   20180901
4069800 168449  less than   20181001
4205460 174009  less than   20181101
4069800 168433  less than   20181201
4205460 174097  less than   20190101
4205460 174009  less than   20190201
3798480 157201  less than   20190301
4205460 174097  less than   20190401
4069800 168449  less than   20190501
2984520 123545  less than   20190601

我想每月select sum(metric1), sum(metric2)

到目前为止,我正在做的是创建一个将YYYYMM保留为MonthID的临时表,并在substring(dateID,1,6) = MonthID上与我的表联接,然后选择按MonthID分组的总和。但是,这太慢了。我认为,如果我能以某种方式直接使用表的分区进行分组,它将更快。有什么办法吗?如果没有任何方法可以改善总和表现?

1 个答案:

答案 0 :(得分:0)

您可以尝试两种聚合级别:

select left(dateid, 6) as yyyymm,
       sum(metric1), sum(metric2)
from (select dateid, sum(metric1) as metric1, sum(metric2) as metric2
      from t
      group by dateid
     ) t
group by left(dateid, 6)
order by yyyymm;

内部聚合仅在分区键上明确显示。

我应该注意,当分区键是聚合键时,我不知道SQL Server是否在分区数据库上优化group by。但是,可能这样,所以值得尝试。