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

简介:

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


SELECT D,…, SUM(M), … FROM C WHERE D’=d’ AND … GROUP BY D,…


即对立方体按某些维度分组汇总某些测度。其中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访问量,从而提高性能。

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

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

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

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


来源:中生代技术

原文链接

相关实践学习
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
搜索推荐
为什么每个公司都在做自己的OA系统,但是依然没有取代钉钉
为什么每个公司都在做自己的OA系统,但是依然没有取代钉钉
|
5月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
监控 JavaScript 测试技术
从单体应用迁移到微服务的最佳实践
【8月更文第29天】随着软件架构的发展,越来越多的企业开始考虑从传统的单体应用迁移到微服务架构。虽然迁移可以带来诸如更好的可扩展性、更高的灵活性等优势,但这一过程也可能充满挑战。本文将详细介绍如何顺利地进行这一转变,并提供一些实用的步骤和示例代码。
532 1
|
8月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2317 7
|
11月前
|
JavaScript 算法
Vue 中如何手动更新虚拟 DOM?
Vue 中如何手动更新虚拟 DOM?
560 57
|
边缘计算 人工智能 Cloud Native
未来云计算发展趋势及挑战
随着数字化转型的加速推进,云计算作为关键基础设施之一,正扮演着越来越重要的角色。本文探讨了未来云计算的发展趋势和面临的挑战,分析了云原生技术、多云环境管理等领域的创新,展望了云计算在不断变革的科技领域中的前景。
2346 28
|
大数据 UED
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表
List 和 Grid 是鸿蒙开发中的核心组件,用于展示动态数据。List 适合展示垂直或水平排列的数据列表,而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件,并通过按钮实现布局切换,提升界面的灵活性和用户体验。
823 9
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表
|
Web App开发 前端开发 JavaScript
WebKit 入门介绍
WebKit 入门介绍
|
传感器 人工智能 自动驾驶
未来出行新纪元:智能交通系统的崛起与影响
【10月更文挑战第13天】 本文深入探讨了智能交通系统(ITS)的发展背景、关键技术及其对社会、经济和环境的深远影响。通过对现有技术的评估和未来趋势的展望,揭示了ITS在提升交通效率、减少碳排放、增强安全性和推动经济发展方面的巨大潜力。同时,也讨论了在技术实施过程中面临的挑战和潜在的解决方案。
|
机器学习/深度学习 人工智能 数据挖掘
【机器学习】贝叶斯统计中,“先验概率”和“后验概率”的区别?
【5月更文挑战第11天】【机器学习】贝叶斯统计中,“先验概率”和“后验概率”的区别?