【问题标题】:sum columns of a table, grouping by table partition对表的列求和,按表分区分组
【发布时间】:2019-10-09 23:02:24
【问题描述】:

我有一张包含每日指标的表格:

|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 分组的总和。然而这太慢了。我认为如果我可以通过直接使用表的分区进行分组会更快。有什么办法吗?如果没有任何方法可以提高总和性能?

【问题讨论】:

  • DateID 列是否存储为 int?
  • 不,它是 varchar(8)

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


【解决方案1】:

您可以尝试两个级别的聚合:

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。不过也有可能,所以值得一试。

【讨论】:

  • 两级聚合有效地提高了性能。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2020-09-14
  • 2017-08-12
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多