在Olap查询过程中,经常遇到行轴和列轴上都存在压缩空行的情况。查询的MDX如下所示,select NotEmpty(…) ON COLUMNS, NotEmpty(…) ON ROWS from (…) where (…)。Olap引擎在执行MDX时,需要先知道行轴和列轴上都有哪些成员参与计算,也就是说需要计算行轴和列轴上的成员有哪些。但是,在Olap引擎执行此类型的MDX时,会计算轴上所有成员的指标值。因为只有通过计算指标值后,才能够确定哪些成员值是空,哪些成员值是非空。在最后的报表显示中,可以过滤掉指标为空的成员。因此,按照这种情形的MDX,Olap引擎需要执行计算的次数会大大增加,单单是计算轴上的表达式时,就会进行实际的指标求值的操作。当维度下的成员个数比较多时,计算会耗费大量时间,使系统性能降低。
解决方案:根据实际的业务场景,如果在事实表中没有出现与某维度关联的数据,那么在这个维度上交叉的值都为空,即在NotEmpty的场景下应该忽略。故可以在维表使用的语义模型中添加过滤描述器,通过用关联的事实表(fact_demo)中维度的字段(pk_dim)值,过滤维度表(dim_demo)数据,如 from dim_demo where pk_dim in (select distict pk_dim from fact_demo) ,这样可以减少NotEmpty函数的计算量,使这种情况中的MDX执行效率大大提高。
后面的版本(V2.3)Olap引擎会根据维度表和事实表的关联字段,自动对维度的查询SQL进行优化,提升效率。