none
这样的“数据汇总”过程怎么处理比较好? RRS feed

  • 问题

  • 比如现实情况是这样的:
            有 “几千块“ 电表,电表每”5分钟“一组数据,包括“电量、电功率、电压、电流”等。   要把电量数据进行累计汇总,按表具处理为”逐时、逐日、逐月、逐年”的数据。  还要按照建筑(表具属于建筑)处理为”逐时、逐日、逐月、逐年”的数据。 

    电量还要分为“照明、空调、动力、消防”等。   

    这样多维度数据的计算,使用什么办法比较好???

    现在使用“存储过程  +  作业”的形式在 数据库中直接处理,可以处理但非常不好维护。   

    用触发器,会开启隐藏“事务”,这样不是会造成系统开销比较大???        用触发器好,还是写一个存储过程用作业执行比较好???         

    以前是写了一组存储过程,通过作业来执行的。但这样会出现作业比较多。因为虽然是“同一组存储过程”,但是要根据“建筑名称”分类,每个建筑的数据都要执行这一组存储过程,造成维护非常的不方便。。。   用触发器是不是没有这个问题。

    比如,在同一秒钟插入了“10000”条数据,是不是同时并发“10000”个触发事件,去处理每一条数据。

    如果用Insert触发器,是不是只有在插入成功了之后,才返回插入成功信号???     是不是在插入的过程中执行触发器。    这样插入一条数据到返回的时间太长了,太影响效率。

    大项目不太适合用触发器,资源开销太大了,影响并发。

    如果是使用客户端软件来处理,客户端软件应该如何设计呢???


    Science and technology is my lover.

    2014年6月12日 8:23

答案

  • 第一个问题:个人偏于用job+存储过程会比较好

    每个建筑的数据都要执行这一组存储过程,是不是设计不合理

    你可以每一个存储过程一个jobstep,分步处理

    第二个问题:

    在同一秒钟插入了“10000”条数据,是不是同时并发“10000”个触发事件,去处理每一条数据。

    在sqlserver里面其实是串行执行的,你插入10000条数据其实是有先后顺序的

    第三个问题

    如果用Insert触发器,是不是只有在插入成功了之后,才返回插入成功信号???     是不是在插入的过程中执行触发器。    这样插入一条数据到返回的时间太长了,太影响效率。

    不是插入成功之后才返回插入成功信号,当事务已经提交并写入到事务日志文件里的时候sqlserver会返回成功信号给客户端跟用不用insert触发器没有关系,看你用的是哪一种触发器并不是插入过程中执行触发器

    大项目不是不太适合用触发器,而是看情况,如果数据量少的表,而且有理由用触发器,个人觉得可以用

    对于你那种统计的需求,估计是有一张大表保存有 “几千块“ 电表的数据,而且那张表数据量上亿

    用作业+存储过程还是比较好的

    这么大量的数据统计的工作,交给客户端不太合适,LZ可以考虑使用数据库复制,快照之类的技术

    报表软件只读订阅库或者快照库减轻主库的压力

    2014年6月12日 9:46

全部回复

  • 第一个问题:个人偏于用job+存储过程会比较好

    每个建筑的数据都要执行这一组存储过程,是不是设计不合理

    你可以每一个存储过程一个jobstep,分步处理

    第二个问题:

    在同一秒钟插入了“10000”条数据,是不是同时并发“10000”个触发事件,去处理每一条数据。

    在sqlserver里面其实是串行执行的,你插入10000条数据其实是有先后顺序的

    第三个问题

    如果用Insert触发器,是不是只有在插入成功了之后,才返回插入成功信号???     是不是在插入的过程中执行触发器。    这样插入一条数据到返回的时间太长了,太影响效率。

    不是插入成功之后才返回插入成功信号,当事务已经提交并写入到事务日志文件里的时候sqlserver会返回成功信号给客户端跟用不用insert触发器没有关系,看你用的是哪一种触发器并不是插入过程中执行触发器

    大项目不是不太适合用触发器,而是看情况,如果数据量少的表,而且有理由用触发器,个人觉得可以用

    对于你那种统计的需求,估计是有一张大表保存有 “几千块“ 电表的数据,而且那张表数据量上亿

    用作业+存储过程还是比较好的

    这么大量的数据统计的工作,交给客户端不太合适,LZ可以考虑使用数据库复制,快照之类的技术

    报表软件只读订阅库或者快照库减轻主库的压力

    2014年6月12日 9:46
  • 显然是用OLAP处理最好。

    实在要在Database里面做,可以用Indexed view来做,当然,开销也是有的。


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

    2014年6月12日 11:20
    版主