【数据蒋堂】多维分析的后台性能优化手段

简介:
 

开篇辞


《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。


多维分析就是针对一个事先准备好的数据立方体实施旋转、切片(切块)、钻取等交互操作的过程,经常也被直接称为OLAP。它的后台运算在结构上很简单,如果用SQL语法描述,大体形式为:



即对立方体按某些维度分组汇总某些测度。其中C是数据立方体,D,...是选出维度,M,...是聚合测度,聚合函数也可以不是SUM。D'是切片维度,切块时条件为D IN (d,...),WHERE中还可以增加针对某些测度的条件,一般也就是选出某个区间内的值。


OLAP需要即时响应,对性能要求很高,而这个运算形式虽然很简单,但数据量大时的计算量也不小,如果不设法优化,效率就可能很差。下面我们介绍多维分析后台建设时几种经常被采用的性能优化手段。


预先汇总


预先汇总是早期OLAP产品常用的手段,简单地就是拿空间换时间。把部分或者全部维度组合(GROUP BY子句)的汇总值(SELECT中的聚合测度)先计算出来保存,以后的计算可以直接取出或从这些中间结果再计算,性能会好很多。


预先汇总占用的空间有点大。如果保存全部维度组合,一般应用场景下(十几到几十个维度,维度取值范围在几到几十之间),简单计算可知,空间占用会比原始立方体大数倍到数十倍((k1+1)*(k2+1)*...与k1*k2*...之间的比,还要考虑多种聚合函数)。虽然要保证即时响应的立方体通常不会太大,但再大几十倍也还是难以接受的。


折衷办法是只保存部分维度组合。OLAP过程中在界面上呈现出来的分组维度(GROUP BY子句)不会太多,可以只汇总所有m个维度的组合,在m不太大时(一般不超过5),空间增长还可以容忍,而用户的大多数操作都可以得到较迅速响应。

麻烦在于,部分汇总解决不了针对其它维度的切片条件,钻取动作就是以切片为基础的。而且,即使全量汇总也无法处理测度上的条件(比如销售额超过1000元的统计),而多维分析时常常允许这些动作,甚至聚合函数也可能带有条件(只合计100元以下的费用),这些都无法使用预先汇总的结果。


预先汇总只能解决小部分最常见的计算,更多的情况还是要靠硬遍历。


分段并行


多维分析本质上是过滤和分组汇总,这种运算很容易并行。只要简单地数据拆成多段后分别处理,收集到结果再汇总。各个子任务之间没有依赖关系,无论是单机多线程还是集群多机或者综合有之,都不难实现。


多维分析的结果是要呈现给人看的,而人可以观察的数据量远远小于现代计算机的内存。可以放入内存的小结果集不需要和外存交换,程序设计复杂度较低,运算性能也好。如果运算时发现结果集太大是可以直接报告给界面相应信息并中止。


实践测试表明:多线程计算时,不要采用各子任务向同一个结果集汇总的方案,这样看起来会减少内存占用(各子任务共用一个最终结果集),但多线程抢占同一资源需要的同步动作会严重影响性能。


线程数也不是越多越好,显然超过CPU核数就没有意义了。如果数据在外存,还要考虑硬盘的并发能力,一般会比CPU核数小很多,具体合适的数值需要实际测试才知道。


在数据不再变化时分段也容易,按记录数切分后设置分段点即可。数据可追加时要做到较平均的分段会有些麻烦,以后再另外撰文陈述。


对于单个计算任务,并行后常常有数倍的性能提升。但是,OLAP操作本身就是个并发性事务,即使用户数不大,也足以抵消并行计算带来的性能提升。


还要再想办法。


排序索引


没有切片的汇总运算总是要涉及全量数据,如果不是预先汇总,也没什么办法再减少计算量了。但有切片运算时(钻取动作),如果数据能合理组织,就未必要遍历所有数据了。


如果我们为维度D建立索引(即把各记录的D值及记录位置按D值排序),那么涉及D的切片条件就可以迅速定位到相应的记录上(简单二分法),不需要遍历全量数据,计算量常常会有数量级的减少(取决于D的取值范围)。理论上我们可以为每个维度都建立索引,这个成本并不算高,这样只要涉及有切片时,性能就会大幅提升。


需要指明的是,为多个维度D1,D2建立的多字段索引用处并不大,它不能用于迅速定位只有D2的切片,只能用于对D1,D2都有切片条件的情况。在选择取值范围最大的那个切片维度用于定位后,计算量减少已经很多了,其它维度的切片可以仍用遍历手段。


不幸的是,这种原始方案只适用于可以频繁小量访问的内存数据。如果数据量大到必须放在外存中(而这是经常发生的),按索引大量取出实际上并未连续存储的数据时,性能并不会有明显提高。外存数据必须被真实排序、保证相应切片的数据是连续存储的,性能提升才会有效。


如果对每个维度都做排序,那相当于数据要被复制若干倍,这个成本就有点高了。


一个折衷的办法是做两个,按维度D1,...,Dn排序一次,再按Dn,...,D1排序一次,数据量只是翻倍,还能容忍。总能找到一个切片维度在两个维度排序列的前半部分,这样该维度切片的数据还是基本连续的,性能提升仍会较为明显。


列存压缩


对付多维分析还有个大杀器:列式存储。


多维分析的立方体中字段(维度和测度)常常都很多,几十个上百个都很正常,但同时需要取用的字段并不多,如果不算切片维度,通常也就5个左右或更少。而切片可以用上面的索引方案解决,实际要遍历的字段也仍然不多。


这时候列存就会有巨大优势了。外存计算的IO时间占比相当大,减少数据读取量比减少运算量常常能更有效地提高性能。一个100个字段的立方体,如果只取5个字段时,IO开销只有1/20,这会带来数量级的性能提升。


列存还有个优势是可以压缩数据量。如果按前述所说将数据按维度D1,...,Dn排序存储,我们会发现D1在连续许多记录中取值都相同,D2也是类似,但程度会弱一些,越往后的维度连续相同的程度越弱,Dn就会几乎没有相同连续值。连续相同的值没必要重复存储,可以只存一次并记录个数,这样将可以进一步减少存储量,也就是减少外存IO访问量,从而提高性能。


当然,列存也并不全是好处。


因为不减少计算量,列存对于内存数据用处不大。不过压缩存储方式仍然有意义,可以减少内存占用。


使用列存会使分段并行及建立索引的处理变得更复杂,各个列需要同步分段才能并行处理,索引也需要同步指向所有列,而使用压缩机制后同步更为麻烦。不过,总得来讲,在数据已经确定不再变化时,虽然麻烦,但难度并不算大,只是别忘处理了就行。


列存还会加大硬盘的并发压力,在总字段数不多或取用字段较多时并没有优势。对于机械硬盘,如果再使用并行手段进一步加剧并发压力,很可能导致性能不升反降的结果,对于易于并发的固态硬盘使用列存较为合适。


专栏作者简介

蒋步星,润乾软件创始人、首席科学家

清华大学计算机硕士,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016年,荣获中国电子信息产业发展研究院评选的“2016年中国软件和信息服务业十大领军人物”;2017年, 自主创新研发新一代的数据仓库、云数据库等产品即将面世。


原文发布时间为:2017-04-07

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关实践学习
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
9月前
|
数据采集 运维 安全
HTTPS代理企业级出站Web访问与数据采集的安全可运营基座
面向企业出站Web访问与数据采集,HTTPS代理以CONNECT隧道+端到端TLS构建加密边界,结合Socks5分层策略,依托全球8000万+住宅IP与高可用托管网络,实现可治理、可审计、低延迟、高并发的跨境流量调度,支持精细化策略控制与SLA保障,合规高效。
|
6月前
|
存储 人工智能 自然语言处理
java智能导诊源码,智能虚拟导诊分诊系统的设计与实现
3D人体图智能导诊系统,即“智能虚拟导诊/分诊系统”,聚焦人机交互易用性与分诊准确性。通过3D人体模型、多模态输入(点击、语音、文本)、AI语义理解与医学知识图谱,实现症状自识别、智能追问、科室精准推荐,并集成预约挂号等就医服务。系统以用户为中心,采用规则+AI融合推理,确保分诊可解释与安全可控,助力医院智慧化高效分流。
323 2
|
6月前
|
存储 人工智能 自然语言处理
从真实项目出发,西南智能体实践中AI智能体运营工程师是如何被训练的
随着AI智能体加速落地,西南地区成为应用新热土。本文揭秘“AI智能体运营工程师就业班”实战培养模式:以真实场景驱动,通过金加德等专家指导,系统训练需求拆解、Prompt工程、Coze工作流搭建与RAG调优,助力学员掌握从复刻到原创的全链路能力,打造懂业务、懂技术的复合型人才,抢占智能体时代职业先机。(
283 2
|
7月前
|
机器学习/深度学习 文字识别 算法
OCR与语义分割技术详解:法小师如何智能解析纸质合同
语义分割结合OCR,实现文档像素级理解,精准识别标题、表格、签名等元素,破解传统OCR无法解析版面的难题。通过深度学习与多模态融合,将复杂合同转化为可编辑、可分析的结构化数据,助力智能文档处理迈向“机器认知”新阶段。(238字)
|
7月前
|
人工智能 弹性计算 安全
阿里云组合购套餐云产品配置及价格汇总,覆盖众多热门上云场景,组合购买价格更实惠
对于很多上云用户来说,业务上云往往不仅需要云服务器,同时还需要建站产品、oss云存储产品、SSL数字证书等其他云产品,为进一步降低企业用户上云的技术门槛与成本投入,阿里云推出各种云产品的“超值组合购”专项活动。本文为大家汇总了目前云产品组合购中各个套餐的主要云产品信息及价格,以供大家参考和选择。
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
景区博物馆最新应用:历史IP复活,移动AI数字人互动屏打造文旅爆款体验
世优波塔移动AI数字人互动屏,以高精度建模与AI大模型技术“复活”历史人物,打造可对话、会讲解、能导览的沉浸式文旅体验。通过自然语言交互、智能移动导引与多设备联动,让文物“开口说话”,让文化“活”起来,重新定义博物馆、景区与传统文化的连接方式,开启智慧文旅新纪元。
554 0
|
网络协议 Java 应用服务中间件
深入浅出Tomcat网络通信的高并发处理机制
【10月更文挑战第3天】本文详细解析了Tomcat在处理高并发网络请求时的机制,重点关注了其三种不同的IO模型:NioEndPoint、Nio2EndPoint 和 AprEndPoint。NioEndPoint 采用多路复用模型,通过 Acceptor 接收连接、Poller 监听事件及 Executor 处理请求;Nio2EndPoint 则使用 AIO 异步模型,通过回调函数处理连接和数据就绪事件;AprEndPoint 通过 JNI 调用本地库实现高性能,但已在 Tomcat 10 中弃用
深入浅出Tomcat网络通信的高并发处理机制
|
数据采集 运维 供应链
终于有人讲清楚了!ERP、MES、SRM、SCM、QMS、EAM、APS、PLM、OA、CRM、WMS、TMS、SCADA、HR...
在数字化时代,企业依赖多种信息系统提升运营效率。本文详解ERP、MES、SRM等14类系统功能与应用场景,并剖析其协同价值。从初创到全球化企业,各阶段系统引入策略清晰展现。
|
11月前
|
消息中间件 前端开发 Java
如何开发人事管理系统中的离职管理板块?(附架构图+流程图+代码参考)
在数字化时代,企业人力资源管理趋向全流程、闭环化、数据驱动。人事管理系统(HRMS)涵盖招聘、入职到离职的全生命周期管理,其中离职管理是关键环节,涉及流程规范、交接透明、反馈收集等,能有效降低风险、提升效率。本文以简道云HRMS为例,解析离职管理模块的设计与实现,包括系统架构、核心功能、开发技巧与最佳实践,助力企业优化人力资源管理流程,实现高效、合规、数据驱动的离职管理。