中间表的由来

  中间表是数据库中专门存放中间计算结果的数据表。报表系统中的中间表是普遍存在的。那么,这些中间表是如何出现的?为什么中间表会越来越多?中间表会给项目组带来什么样的困扰,如何解决这些困扰?这里我们就尝试探讨一下这个问题。

  中间表出现的典型场景主要有三个:

  一步算不出来。数据库中的原始数据表要经过复杂计算,才能在报表上展现出来。一个SQL很难实现这样的复杂计算。要连续多个SQL实现,前面的生成中间表给后边的SQL使用。

  实时计算等待时间过长。因为数据量大或者计算复杂,报表用户等待时间太长。所以要每天晚上跑批量任务,把数据计算好之后存入中间表。报表用户基于中间表查询就会快很多。

  多样性数据源参加计算。来自于文件、NOSQL、Webservice等的外部数据,需要与数据库内数据进行混合计算时,传统办法只能导入数据库形成中间表。

中间表带来的问题

  在一个运营商的报表系统中,我们发现了一个让人吃惊的现象。在DB2数据仓库中,有两万多个数据库表!经过深入了解发现,真正的原始数据表只有几百张,剩下的大量的数据库表都是为查询和报表服务的中间表。

  经过几年乃至十几年的运行,数据库中的中间表越来越多,甚至出现这个项目中上万个的情况。大量中间表带来的直接困扰是数据库存储空间不够用,面临频繁的扩容需求。中间表对应的存储过程、触发器等等需要占用数据库的计算资源,也会造成数据库的扩容压力。

  那么,是不是可以清理掉一些不用的中间表?一般的结论都是:搞不动。数据库中的中间表是不同程序员制作的,有的是综合查询系统使用,有的是报表系统使用。中间表之间还存在交叉引用,有些程序员看到有别人生成的中间表就直接使用了。有时候一些查询报表已经废弃不用了,但是对应的中间表没人敢删,因为不知道删掉之后会影响其他什么查询或者报表。

  很多情况下,项目组只好为了越来越多的中间表去扩容数据库。但是数据库的扩容成本太昂贵了:不管是换更强的服务器(纵向扩容),还是增加数据库服务器的节点(横向扩容),都不便宜。过于频繁的扩容让项目组非常头疼。

  那么,能不能把中间表导出到文件中,从而减轻数据库的压力呢?这个办法初看挺好,但是有个问题始终无法解决。例如:每天晚上把经营分析表数据生成好之后放到文件中,第二天上班的时候发现,业务人员还要对经营分析表按照各种条件过滤,或者按照各种维度分组。因为文件本身是没有计算能力的,一旦把中间表从数据库中导出成文件就很难进一步计算了。不得已,只能把中间表继续留在数据库中。

解决问题的办法

  采用润乾集算器实现文件计算,就可以把中间表从库中迁移到文件系统中了。采用集算器的前后对比图如下:

  在集算器结构中,数据库的大量中间表都移到了库外,数据库仅仅存储少量原始数据表,压力就小了很多。针对这些中间表实现的多个ETL存储过程、触发器、复杂SQL也都由集算器来实现,数据库的计算压力也变小了很多。虽然计算和存储压力由应用服务器来承担,但是成本还是要比数据库服务器低很多。项目组不用再每隔一段时间就申请数据库服务器扩容了。

  同时,集算器可以读取多样性数据源,直接参与混合计算。无需再导入数据库,成为中间表。

集算器编程很容易

  移到库外的数据文件不能再使用SQL计算了,换成集算器会不会增加编写的难度呢?实际上,集算器编写简单计算脚本的时候和SQL差不多,复杂多步骤计算还要比SQL容易。例如:

  从上述例子来看,采用集算器实现数据文件库外计算,学习成本很低,很容易掌握。

新方案的价值

  新方案的价值还不仅仅是降低数据库的压力。

  对于报表应用而言,中间数据的存在是有价值的:有些中间表是报表业务决定的,有些是为了弥补现有技术的不足。也就是说,中间数据和报表模板一样,都是报表系统的一部分。所以,集算器的方案并没有让中间数据消失,只是移到了库外,保存在报表应用的文件目录中,使得中间表在物理上也成为了报表应用系统的一部分。这样既能发挥中间数据的价值,还可以让中间数据和报表系统的其他部分一起管理。显然,文件系统的树形目录结构比数据库混在一起的几万个表要更容易维护。

  在实际项目中,可以给中间数据文件建立多层文件夹存储。例如:第一层目录是财务管理、人力资源、ERP等等。人力资源又有子目录:工资管理,基本信息,党员信息等等。目录可以细化到某个报表,如果该报表发生了变化,只需要调整这个目录中的报表模板或者数据文件即可。如果该报表废弃不用,那么删掉或者移走报表所在目录,就可以快速的释放硬盘空间。

  从计算速度来说,由于文件更底层,更接近于磁盘,IO性能要好于数据库。所以集算器的方案可以为报表系统带来更快的性能。

  报表数据来自于多样性数据源时,还可以有更好的实时性,不像传统手段时只能定期入库。

为什么会有这么多中间表?相关推荐

  1. mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间

    先贴一张图! 第一步,"很重要" 在mysql中,有一个创建之初自带的库information_schema,这个库中包含着数据库相关信息,查询数据占用空间就是使用该库,所以首先进 ...

  2. 一个form表单,多个提交按钮(实现不同功能和地址的提交)

    直接上代码 表单部分: <form action="" name="find" method="post" enctype=" ...

  3. form表单提交前进行ajax或js验证,校验不通过不提交

    在使用form表单进行提交数据前,需要进行数据的校验->表单的校验(如:两次密码输入是否相同)+后台数据的校验(如:账号是否存在),这个时候,如果哪步校验不通过,表单将停止提交,同时避免后台主键 ...

  4. 用js方法做提交表单的校验

    基础知识: 原始提交如下: <form action="<%=basePath %>puser/register" method="post" ...

  5. Idea groovy表生成实体类带注释

    Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述. 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的, ...

  6. php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?

    我有两张桌子 table: people id name goods_owned 1 john 1,4,3 2 Mike 2,5 3 Sam 1,5,2 4 Andy 5,3,4 – table go ...

  7. form表单提交编码的问题

    浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urle ...

  8. js异步提交form表单的解决方案

    1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span sty ...

  9. 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作

    上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...

  10. 数据结构(07)— 线性顺序表基本操作

    1. 顺序表结构 #define MaxLen 50typedef struct {int data[MaxLen]; // 定义一个数组来存储线性表中所有元素int len; // 存储线性表的长度 ...

最新文章

  1. 来聊聊可形变卷积及其应用
  2. android——记录从android studio2.3升级到android studio3.0版本遇到的坑
  3. WMI CIM studio无法连接解决 在XP下wmi取不到值可巧用wmic取值
  4. 赠人玫瑰,手有余香-期待协作更新机器学习的公益项目
  5. 傅里叶变换基本概念及复数类实现
  6. mysql warning 日志_Mysql5.7.19安装后错误日志中有警告
  7. linux eth_p_ip,linux数据链路访问之ETH_P_ALL等等
  8. 根据MAC地址修改固定IP(附带IPMAC扫描脚本)
  9. GDAL建立GeoTIFF金字塔文件
  10. win10系统自带图标/壁纸位置
  11. 《编程之美》-- 学习与思考
  12. 用户体验衡量指标分析
  13. 目标检测评估指标 mAP P R
  14. 2018年第九届蓝桥杯JAVA A组国赛 —— 第二题:阅兵方阵(暴力)
  15. 【网络安全必看】如何提升自身WEB渗透能力?
  16. 0CTF piapiapia
  17. 红蓝对抗-红蓝对抗经验总结
  18. Centos7 添加新用户并赋予权限
  19. 自动生成卡密SQL脚本(转载)
  20. ICCV-2021:APR

热门文章

  1. 辽宁电网容载比问题及合理取值研究
  2. python作排产计划_排产计划表
  3. 移动硬盘设备管理有计算机里没有,我的移动硬盘在电脑的设备管理器上可以看到,但是在我的电脑里却找不? 爱问知识人...
  4. 计算机主板虚拟化,启用Lenovo计算机BIOS虚拟化的方法
  5. node.js 上传文件比较 busboy vs. formidable vs. multer vs. multiparty
  6. 分享一个自己做的记账的小程序 - 智能记账,欢迎朋友们体验
  7. 专业心率监测器克服了心电噪声和电源的挑战---凯利讯半导体
  8. 使用 RGL 制作交互式 3D 散点图
  9. JAVA_调用方法_用户输入姓名打印出欢迎词
  10. 基本社会里模型的源码分析