none
关于SSAS中大数据量的group by问题 RRS feed

  • 问题

  • 有一个事实表,如下所示:

        日期          人员外键    超市外键     商品外键   时间段外键   金额

    20121101        1              1               5               1          50.00

    20121101        1              1               6               1          20.00

    20121101        1              2               7               3           5.00

    20121102        1              1               7               3           5.00

    20121102        1              1               6               3           20.00

    现在有一个需求,需要统计某个人员在某段时间内,在不同超市及不同时间段的消费汇总次数(注意,是按照某时间段汇总的笔数,不是每笔消费)及消费金额。说起来有点绕口,举例说明,需要统计人员1在2012年11月份在不同超市不同时间段的消费次数及金额,那么得出的结果是:
       日期          人员外   超市     时间段   次数      金额
    20121101        1       1          1         1      70.00

    20121101        1       2          3         1        5.00

    20121102        1       1          3         1      25.00

    在这里想请教各位,如何能够高效率的完成此需求?此事实表的数据量在1亿以上。目前我的作法是建立一个视图,利用group by语句根据人员外键、超市外键、时间段外键事先汇总好,然后再对此视图进行分析。但由于数据量太大,group by的效率太低,此视图的查询太慢了。

    我还尝试过另外一种方式,即在ETL过程中利用聚合组件,先将数据事先汇总,再导到另外一个事实表中,但由于初始化时数据量过大,聚合组件频繁提示内存不足,所以还是失败。

    不知道各位有没有好的办法?有没有MDX语句可以直接实现上述需求,而不需要再建视图或者事实表的?如果确实需要建立额外的视图或表,有没有高效率的方法呢?

    2013年1月24日 3:17

全部回复

  • 你怎么用的SSAS?本来OLAP的数据就是汇总的。你知道度量值有Sum和Count吧?还有其它的很多种度量值。我做的项目,一个星期的数据就不止一亿了。

    想不想时已是想,不如不想都不想。

    2013年1月24日 4:49
    版主
  • 不知道LZ的数据量有多大呢

    给我写信: QQ我:点击这里给我发消息

    2013年1月24日 12:42
  • 呵呵,sum和count只是对事实表的简单加总和计数,但如果只对上述事实表简单的进行count,那么消费汇总次数就不对了。比如某人在早上10点钟时买了3个商品,事实表记录的是3条记录,如果进行count的话,那么消费次数就等于3.但是实际上对于某人来说,只是1次消费行为,所以需要事先按照人员、时间段进行group by 之后才能进行count计数。不知道斑竹有没有好的建议?

    2013年1月25日 0:52
  • 目前数据量不算大,1亿多。
    2013年1月25日 0:58
  • 如果你用了SSAS, 那为什么还在用传统的 SELECT GROUP BY 做聚合呢?

    建议你还是系统地去学习一下SSAS 吧, MSDN 上有相应的课程, 建议你至少跟着走一次

    2013年1月25日 2:33