问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

多维分析预汇总应该怎样做才管用?

发布网友 发布时间:2024-09-26 23:45

我来回答

1个回答

热心网友 时间:2024-09-27 22:48

??????\哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验\中国DBA联盟(ACDU)成员,目前从事DBA及程序编程???\擅长Oracle、MySQL、PG运维开发,备份恢复,安装迁移,性能优化、故障应急处理。\??????感谢各位大可爱小可爱!??????

摘要:多维分析预汇总应该怎样做才管用,本文做了详细的说明

多维分析(OLAP)通常要求极高的响应效率,当涉及的数据量很大时,每次都基于明细数据汇总效率就会很低,人们会考虑采用预汇总的方式加快查询速度,即事先将要查询的结果计算好,使用时直接读取预汇总结果就可以获得实时响应,从而满足交互分析的需要。

不过,将可能的维度组合全部预汇总不太现实,按中间CUBE大小仅1KB计算50个维度的全量预汇总需要的存储空间高达1MT,需要100百万块1T的硬盘,即使只汇总其中20个维度也要占用470000T的空间(多维分析预汇总的存储容量),显然都不能接受。所以,一般会采用部分预汇总的方式,汇总其中一部分维度以平衡存储空间和性能需要。

预汇总方案的困境

其实,即使不考虑容量问题,预汇总也只能满足多维分析中一小部分相对固定的查询需求,稍微复杂灵活的场景就搞不定了,而这些场景在实际业务中大量存在。

非常规聚合:除了常见的合计、计数外,有些非常规聚合,比如唯一计数、中位数、方差等很可能被遗漏,也无法从其它聚合值计算出来。理论上有无数种聚合运算,不可能被预汇总。

组合聚合:聚合运算可能组合。比如我们可能关心月平均销售额,这个值是将每天的销售额按月合计后再求平均。它并不是单纯的合计和平均,而是两种聚合运算在不同维度层次上的组合。这些也不太可能事先预汇总。

条件测度:测度在统计时还可能带有条件。比如,我们想了解一下交易金额大于100元以上的订单销售额合计。这个信息也无法在预汇总时处理,因为100会是临时输入的参数。

时间段统计:时间是个特别维度,它即可以枚举、也可以采用连续区间的方式来做切片。查询区间的起止点可能是细粒度(比如到某日),就必须用细粒度的数据再统计,而无法直接使用更高层的预汇总数据。

预汇总的确能一定程度地提高多维分析的性能,但只能应对多维分析中很少的场景,而且还只能部分预汇总,使用场景就更有限了,即使这样还要面临巨大存储空间的问题。把多维分析的效果寄希望于预汇总方案并不靠谱。要做好多维分析,硬遍历的功夫是基本的,即使有了预汇总数据,也要在优秀的硬遍历能力辅助下才能发挥更大的作用。

SPL预汇总

开源的集算器SPL提供了常规多维分析预汇总方式,还有特色的时间段预汇总,更重要的是借助SPL优秀的数据遍历能力还能满足多维分析更广泛的场景需要。

首先看一下SPL的预汇总能力。

部分预汇总

全量预汇总不现实,只能进行部分预汇总,虽然无法达到O(1)的响应速度,但也可以把性能提升几十倍,有一定意义。SPL可以根据需要建立多个预汇总的中间结果。例如,数据表T有A、B、C、D、E五个维度。根据业务经验就可以预先计算出来了几个最常用的中间结果。

上图中cube占用存储空间的大小用条形长度来表示,cube1最大,cube2最小。前端应用来了一个请求,要按照B、C做统计汇总。这时SPL对多个cube自动选择的过程大致如下。

第i步,SPL找到可以利用的cube是cube1和cube3。第ii步,SPL发现cube1比较大,就会自动选择比较小的cube3,并在其基础上按B、C做分组汇总。

SPL代码示例:

A1=file("T.ctx").open()2=A1.cuboid(cube1,A,B,C;sum(…),avg(…),…)3=A1.cuboid(cube2,A,C,D;sum(…),avg(…),…)4=A1.cgroups(B,C;sum(…),avg(…))

使用cuboid函数建立预汇总数据(A2和A3),需要起个名字(如cube1),剩下的参数是维度和汇总测度;A4使用时通过cgroups函数就会自动利用上面的规则使用中间cube并选择数据量最小的使用了。

时间段预汇总

时间是多维分析中特别重要的一种维度,它即可以枚举、也可以采用连续区间的方式来做切片。比如业务中经常要查询如5月8日到6月12日之间的销售额合计,这个起止时间点也是查询时作为参数传递进来的,具有很强的随意性。时间段统计还可能有多个组合关联的情况,比如看看5月8日到6月12日间销出的、生产日期在1月9日到2月17日之间的货品总额。类似这种时间段统计有很强的业务意义,但却无法使用常规预汇总方案应对。

针对这种特殊的时间段统计,SPL提供了时间段预汇总方式。例如,订单表已经有一个按照订单日期预汇总的cube1,那么我们可以在此基础上再增加一个按月预汇总的cube2。这时要计算2018年1月22日到9月8日的金额汇总值,大致过程会是这样:

将时间段分成三段,2月到8月整月的数据基于月汇总cube2计算聚合值,再使用cube1计算1月22日到1月31日和9月1日到9月8日的聚合值,涉及的计算量是7(2月-8月)+10(1月22日-1月31日)+8(9月1日-9月8日)=25,而如果使用cube1数据聚合,其计算量是223(从1月22日到9月8日的天数),几乎减少了10倍。

SPL代码示例:

A1=file("orders.ctx").open()2=A1.cuboid(cube1,odate,dept;sum(amt))3=A1.cuboid(cube2,month@y(odate),dept;sum(amt))4=A1.cgroups(dept;sum(amt);odate>=date(2018,1,22)&&dt<=date(2018,9,8))

cgroups函数增加了条件参数,SPL发现有时间段条件和更高层次的预汇总数据,则会使用时间段预汇总机制来减少运算量。本例中,就会分别从cube1和cube2中读取相应数据再来汇总。

SPL硬遍历

预汇总能够应对的场景仍然很有限,要做出灵活的多维分析,还是要指望过硬的遍历能力。多维分析运算本身并不算复杂,遍历计算主要是针对维度的过滤。传统数据库只能用WHERE硬算,维度相关的过滤也当作常规运算,不能获得较好的性能。SPL提供了多种维度过滤机制,可以满足各类多维分析场景的性能要求。

布尔维序列

多维分析中最常见的切片(切块)是针对枚举维度进行的,除了时间维度几乎都是枚举维度,如产品、地区、类型等。常规处理方式用SQL表达大概这样:

SELECTD1,…,SUM(M1),COUNT(ID)…FROMTGROUPBYD1,…WHEREDiin(di1,di2…)…

其中的Diin(di1,di2)就是过滤字段在一个枚举范围内取值。在实际应用中,“按照客户性别、员工部门、产品类型等切片”都属于枚举维度切片。常规的IN方法需要进行多次比较判断才能筛选出符合条件的数据(切片),性能很低,IN的取值越多性能就越差。

SPL将查找运算转换成取值运算来提升性能。先将枚举维度转换成整数),如下图将事实表中的维度D5取值转化成在维表中的序号(位置):

然后在查询时将切片条件转换成布尔值构成的对位序列,在比较时就可以直接从序列指定位置取出值(true/false)判断结果,快速完成切片操作。

SPL数据预处理代码示例:

A1=file("T.ctx").open()2=file("T_new.ctx”).create(…)3=DV=T(“DV.btx”)4=A1.cursor().run(D=DV.pos@b(D))5=A2.append@i(A4)

A3读取维表,A4利用DV把维度D转换成整数。DV将被另外保存供查询时使用。

切片汇总:

A1=file("T.ctx").open()2=DV.(V.pos(~))3=A1.cursor(…;A2(D))4=A3.groups(…)

A2将参数V转化成一个和DV同长的布尔值序列,DV的成员在V中时,则A2对应位置的成员将非空(判断时起到true的作用),否则填成空(也就是false)。然后在遍历切片时,只用已经转换成整数维度D作为序号去取这个布尔值序列的成员,如果非空就表明原来的维度D是属于切片条件V的。序号取值的运算复杂度远远小于IN比较,大幅提升切片性能。

SPL优秀的硬遍历能力在实践中应用效果明显,在开源SPL提速银行用户画像客群交集计算200+倍这个案例中,借助布尔维序列、游标前过滤等硬遍历技术将银行用户画像客群交集计算效率提升了200倍以上。

标签位维度

多维分析中还有一种特殊的枚举维度常用于切片(很少用于分组统计),其取值只有是/否或true/false两种情况,被称为标签维度或二值维度,比如人员是否结婚、是否上过大学、是否拥有信用卡等。标签维度切片属于过滤条件中的是否型计算,用SQL表达大概这样:

SELECTD1,…,SUM(M1),COUNT(ID)…FROMTGROUPBYD1,…WHEREDj=trueandDk=false…

标签维度很常见,对客户、事物贴标签是当前数据分析的重要手段,现代多维分析的数据集常常会有几百甚至上千个标签维度,如果将这种维度当作普通字段处理,无论是存储还是运算都会造成很多浪费,难以获得高性能。

标签维度只有两种取值,只要一个位就可以存储了。一个16位的整数可以保存16个标签,原本要用16个字段来存储的信息用一个字段就够了,这种存储方式称为标签位维度。SPL提供了这种机制,这将大幅度减少存储量也就是硬盘读取量,而且整数也不影响读取速度。

举个例子,这里我们假设总共有8个二值维度,用整数字段c1存储8位二进制数表示。要用按位存储的方法计算二值维度切片,需要先将事实表预处理为按位存储。

处理后的事实表,第一行c1为AFh,转换为二进制数为10100000,表示D6、D8是true,其他二值维度是false。然后就可以进行按位计算实现二值维度切片了。

前端传入的切片条件为"2,3",也就是要过滤出第2个二值维度(D7)和第3个二值维度(D8)值是true,其他二值维度是false的数据。

SPL代码示例:

AB1="2,3"=A1.split@p(",")2=to(8).(0)=B1.(A2(8-~+1)=1)3=bits(A2)4=file("T.ctx").open().cursor(;and(c1,A3)==A3)5=A4.groups(~.D1,~.D2,~.D3,~.D4;sum(~.M1):S,count(ID):C)

8个是否型条件过滤,只要做一次按位与计算即可实现。这样就将原来二值维度的多次比较计算,转换成了一次按位与计算,因此性能会有很明显的提升。多个是否值转换为一个整数,还可以减少数据占用的存储空间。

冗余排序

冗余排序是利用有序来加快读取(遍历)速度的优化手段,具体实现时按维度D1,…,Dn排序后存储一份,再按Dn,…,D1排序存储一份,数据量会翻倍,但还可以接受。对于任何维度D,总能有一个数据集使D在其排序维度列表中的前半部分,如果不是第一个维度,切片后数据一般不会能连成一片区域,但也是由一些相对较大的连续区域构成的。在排序维度列表中越靠前的维度,切片后数据的物理有序程度就越高。

在计算时,使用一个维度的切片条件来筛选就可以了,其它维度上的条件仍然用遍历计算。多维分析时某一个维度上的切片,常常都能使涉及数据量减少数倍或数十倍,在其它维度上再利用切片条件的意义就不大了。有多个维度上都有切片条件时,SPL会选择切片后范围和总取值范围相比较小的维度,通常意味着过滤后的数据量更小。

SPL的cgroups函数中实现了这个选择,如果发现有多个预汇总数据按不同维度排序的,且有切片条件时,则会选择最合适的那个。

A1=file("T.ctx").open()2=A1.cuboid(cube1,D1,D2,…,D10;sum(…))3=A1.cuboid(cube2,D10,D9,…,D1;sum(…))4=A1.cgroups(D2;sum(…);D6>=230&&D6<=910&&D8>=100&&D8<=10&&…)

cuboid建立预汇总数据时分组维度的次序是有意义,针对不同的维度次序会建立出不同的预汇总数据。也可以人为用代码选择合适排序的数据集,以及存储更多种排序的数据集。

此外,SPL中还提供了很多高效运算机制不仅适用多维分析,还可以面向其他数据处理场景,如高性能存储、有序计算、并行计算等等,结合这些能力可以获得更高效的数据处理体验。

诚如前面所说,预汇总只能解决多维分析中一小部分相对简单固定的需求,其他大量常见的需求还需要使用诸如SPL这样的计算引擎实施高效硬遍历才能很好满足,在优秀的硬遍历能力基础上再结合SPL提供的部分预汇总与时间段预汇总功能就可以更好地满足多维分析在性能和灵活性方面的要求,同时将存储成本降到最低。

使用SPL应对多维分析场景覆盖范围广、查询性能高、使用成本低,这才是理想的技术方案。

原文:https://juejin.cn/post/7111439278277656612
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 赶集网上的二手房那么便宜靠谱嘛?有房子所有的证件吗 长尾优化汇总 中行理财产品是否保本 请问小米音响如何连接到电脑上使用啊? 小米小爱音响连接电脑的方法是什么? 中行自营理财会不会赔本 小米音响怎么连接到电脑上? ...文,类似《国民校草是女生》《重生之国民男神》,越多越好 翻译费用记入什么科目 郑州单招哪个学校好 好的单招学校有哪些 翻译收入属于什么所得 什么单招学校好 谈钱不伤感情——同传、交传、陪同、听译、笔译报价全攻略 好单招学校有哪些 四个月宝宝腿纹不对称怎么回事 梦见自己和表妹结婚,但其实她是代表我老公的,然后出门换婚纱时发现... 翻译费计入什么科目 实现对数组"int a[]={***}"进行从小到大的排序,并在控制台窗口输出排完... 表妹和老公在一起背判了我.她带客我还去吗? 做seo优化,需要汇总关键词。将关键词利用宏 如何在EXCEL表格进行自由组... web前端性能优化(全汇总) 《魏成成仙记》最新txt全集下载 58同城,赶集网上买二手房靠谱吗 怎样喝水能养肝? 看门狗游戏帧数优化方法汇总介绍_看门狗游戏帧数优化方法汇总是什么 电话卡显示未注册网络是怎么回事建议按照如下步骤尝试操作 怎么养肝脏最好的方法 女人怎么养肝护肝排毒 喝什么最养肝 ...她照片都留着呢情侣空间啥的都留着呢。这是为啥 如何正确养肝 正确养肝的方法有哪些 女朋友和我分手了~但是她空间还留有我们的照片~情侣空间也没解除还... 女朋友说分手后做朋友,会留着我的一些联系方式,包括QQ的情侣空间也 哪些星座撒谎最易露陷 为什么要来兴业银行 什么是铝模板 微信支付删除记录还能查到吗? 使用腾讯手机管家root后,开机就提示需要允许腾讯手机管家授权,怎么回事... 有谁知道怎么获取手机腾讯管家的授权啊,在电脑中授权出现了下面的问题不... ip## ne开机出现白屏怎么办?