【摘要】
多维分析(OLAP)中常见的枚举维度切片(过滤条件 in)和二值维度(是否型过滤条件)如何优化?点击了解枚举维度与二值维度切片的优化
问题描述
多维分析(OLAP)系统的汇总和切片,实际上是在计算分组汇总和条件过滤。切片过滤条件的情况多种多样,其中比较多的是枚举维度切片和二值维度切片。
枚举维度切片是指过滤条件中的in计算,例如:D5 in (valueB,valueC),也就是过滤条件字段在一个枚举范围内取值的情况。在实际应用中,“按照客户性别、员工部门、产品类型等切片”就属于枚举维度切片的情况。二值维度切片是过滤条件中的是否型计算,例如:D6 =true and D7=false and D8=true。实际应用中的“客户是否属于某几个客群,或者是否属于某几个标签”等就属于二值维度切片。
包含枚举维度和二值维度的多维分析计算,用SQL表示为:
SELECT D1,…,SUM(M1),COUNT(ID)… FROM T GROUP BY D1,…
WHERE Di in (di1,di2…) and Dj =true …
分析过程中,用户选择众多的维度作为where条件时,计算性能会很明显的下降。特别是条件中出现很多in计算,或者有很多二值维度条件都要满足的时候,性能下降的更为明显。
这里我们讨论如何优化in和二值维度条件计算,从而整体提升多维分析性能。
为了方便讲解,我们将上述SQL具体化如下:
SELECT D1,D2,D3,D4,SUM(M1),COUNT(ID) FROM T GROUP BY D1,D2,D3,D4
WHERE D5 in (valueB,valueC) and D6 =true and D7=false and D8=true
假设“D1和D2”、“D3和D4”都是层次关系的维度(“省和市”、“部门和员工”等)。两个汇总值,SUM(M1)是指数值字段M1求和,COUNT(ID)是指对主键ID字段计数。T是指进行OLAP计算的事实表。过滤条件为:D5的值是(valueB,valueC)其中一个,并且D6的值为true、D7为false、D8为true。
这个SQL计算的结果集可以呈现为下面的交叉表:
图1、结果集呈现的交叉表
在多维分析系统中,一般的存储结构如下图:
事实表T:
维表DT1:
图2、数据结构
in计算需要遍历事实表中的数据,每一行数据中的枚举维度值都要和多个枚举值进行比较。假设枚举值的个数是n,事实表中的每一行枚举维度平均都要比较n/2次,计算性能会随着n的增大而明显降低,当n较大时性能会很差。即使n较大时使用二分法,比较次数也还是很多。
是否型计算也需要比较判断。是否型条件比较多的时候,事实表遍历计算性能也会很差。在实际应用中,有可能会出现是否型的维度非常多的情况,比如客户有几千个是否型的标签。如果在事实表中增加几