???????大家好!大家好,我是[它]。江户人称jeames007,10年的DBA工作经验中国DBA联盟(ACDU)。目前从事DBA和程序编程??安装和迁移,性能优化,故障紧急处理。??????谢谢,可爱,可爱!??注意
摘要:如何完成多维分析的摘要 - 概述,本文详细介绍
多维分析(OLAP)通常需要极高的响应效率。当涉及的数据量很大时,每次详细信息的详细信息都会非常低。查询的结果计算得很好。在使用它来获得真实时间响应时,请阅读启发前摘要果实,从而满足交互式分析的需求。
但是,可能的尺寸组合的摘要是不现实的。根据仅1KB的中立方体尺寸,可以计算出最高至1MT所需的整个存储空间的固定,即使仅总结了其中20个。尺寸还必须占据470000T空间(对储存能力的多维分析),这显然是不可接受的。因此,通常采用了一些预先避孕方法来汇总其中的一些以平衡存储空间和性能需求。
实际上,即使不考虑容量问题,摘要也只能满足多维分析中相对固定的查询需求的一小部分,并且不确定稍微复杂且灵活的方案,这些场景存在于实际情况下商业。
该摘要确实可以在一定程度上提高多维分析的性能,但是它只能应对多维分析中的很少情况,并且只能在某些情况下进行部分预选。使用方案更加有限。即使仍然存在,也有必要面对巨大的存储空间的问题。信息不可靠地发送多维分析对临时计划的效果。进行多维分析是必要的。艰难遍历的困难是基本的。即使您有萨姆省前数据,也必须在出色的艰难遍历能力的帮助下发挥更大的作用。
开源收集器SPL提供了常规的多维分析 - 萨默里方法以及特殊的时间段 - 夏季。更重要的是,借助SPL的出色数据遍历能力,它也可以满足多维分析的更广泛的场景需求。
首先查看SPL的预启动能力。
完整的预订摘要是不现实的,只能部分汇总。尽管它无法达到O(1)的响应速度,但它也可以增加数十次的性能,具有一定的意义。SPL可以根据需要建立许多Pre -Concentration中间结果。例如,数据表T具有五个维度:a,b,c,d,e。根据业务经验的考验,可以预先计算出几种最常用的中间结果。
在上图中,立方体占据带有条长度的存储空间的大小,Cube1是最大的,Cube2是最小的。有一个要求前端应用的请求,应根据B和C进行总结。目前,SPL自动选择多个立方体的过程大致如下。
步骤I,SPL发现可以使用的Cube1和Cube3可以使用。在第II步中,SPL发现Cube1相对较大,并且它将自动选择较小的Cube3,并根据B和C作为组摘要。。
SPL代码示例:
c,d;sum(...),avg(...),...)4 = a1.cgroups(b,c; sum(…),avg(…))
使用Cuboid函数来建立摘要数据(A2和A3),该数据需要一个名称(例如Cube1),其余参数为维度和摘要测量。使用最小数据量。
时间是多维分析中特别重要的维度。它可以列举并使用连续的间隔来制作切片。例如,在业务中,应询问5月8日至6月12日之间的销售。此开始时间点也作为参数在查询期间的参数传递,具有很强的休闲性。也可能有多个时间段统计的组合,例如看到1月9日至2月17日从5月8日至2月17日之间的总货物数量6月12日。与此时期统计数据相似,具有强大的业务意义,但不能对传统的避孕计划做出回应。
为了响应此特殊时间段统计信息,SPL提供了一个时间段预夏让方法。例如,订单表的Cube1由订单日期摘要,然后我们可以在此基础上向每月摘要添加另一个Cube2。目前,2018年1月22日至9月8日的金额的汇总价值将为:
时间段分为三个部分。2月至8月的数据基于每月摘要Cube2计算聚合价值,然后使用Cube1从1月22日至1月31日至9月8日的1月22日至1月31日和9月8日计算汇总值。涉及的计算金额为7月(2月至8月)+10(1月22日至1月31日)+8(9月1日至9月8日)= 25,如果您使用Cube1数据聚合,计算金额为223(1月22日至9月的天数8),几乎是10次。
SPL代码示例:
1 =文件(“ orders.ctx”)。open()2 = a1.cuboid(cube1,odate,dept; sum(amt))3 = a1.cuboid(cube2,month@y(odate),dept; sum; sum(sum(sum(sum(sum(sum))(sumamt)4 = a1.cgroups(dept; sum(amt); odate> = date(2018,1,22)&& dt;<=date(2018,9,8))
cgroups 函数增加了条件参数,SPL 发现有时间段条件和更高层次的预汇总数据,则会使用时间段预汇总机制来减少运算量。本例中,就会分别从 cube1 和 cube2 中读取相应数据再来汇总。
预汇总能够应对的场景仍然很有限,要做出灵活的多维分析,还是要指望过硬的遍历能力。多维分析运算本身并不算复杂,遍历计算主要是针对维度的过滤。传统数据库只能用WHERE硬算,维度相关的过滤也当作常规运算,不能获得较好的性能。SPL提供了多种维度过滤机制,可以满足各类多维分析场景的性能要求。
多维分析中最常见的切片(切块)是针对枚举维度进行的,除了时间维度几乎都是枚举维度,如产品、地区、类型等。常规处理方式用SQL表达大概这样:
其中的Di in(di1,di2)就是过滤字段在一个枚举范围内取值。在实际应用中,“按照客户性别、员工部门、产品类型等切片”都属于枚举维度切片。常规的IN方法需要进行多次比较判断才能筛选出符合条件的数据(切片),性能很低,IN的取值越多性能就越差。
SPL将查找运算转换成取值运算来提升性能。先将枚举维度转换成整数),如下图将事实表中的维度D5取值转化成在维表中的序号(位置):
然后在查询时将切片条件转换成布尔值构成的对位序列,在比较时就可以直接从序列指定位置取出值(true/false)判断结果,快速完成切片操作。
SPL数据预处理代码示例:
1 =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 将被另外保存供查询时使用。
切片汇总:
1 =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表达大概这样:
标签维度很常见,对客户、事物贴标签是当前数据分析的重要手段,现代多维分析的数据集常常会有几百甚至上千个标签维度,如果将这种维度当作普通字段处理,无论是存储还是运算都会造成很多浪费,难以获得高性能。
标签维度只有两种取值,只要一个位就可以存储了。一个 16 位的整数可以保存 16 个标签,原本要用 16 个字段来存储的信息用一个字段就够了,这种存储方式称为标签位维度。SPL提供了这种机制,这将大幅度减少存储量也就是硬盘读取量,而且整数也不影响读取速度。
举个例子,这里我们假设总共有8个二值维度,用整数字段c1存储8位二进制数表示。要用按位存储的方法计算二值维度切片,需要先将事实表预处理为按位存储。
处理后的事实表,第一行c1为AFh,转换为二进制数为10100000,表示D6、D8是true,其他二值维度是false。然后就可以进行按位计算实现二值维度切片了。
前端传入的切片条件为"2,3",也就是要过滤出第2个二值维度(D7)和第3个二值维度(D8)值是true,其他二值维度是false的数据。
SPL代码示例:
1 ="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 函数中实现了这个选择,如果发现有多个预汇总数据按不同维度排序的,且有切片条件时,则会选择最合适的那个。
1 =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提供的PRE -PRE -PRE -CONCOMCONUSH函数的摘要可以更好地满足多维分析的要求性能和灵活性,同时最小化存储成本。
使用SPL来响应具有广泛覆盖范围,高查询性能和低使用成本的多维分析方案。这是理想的技术解决方案。
原始:https://juejin.cn/post/711143927827656612