Chr*_*ris 6 olap join cross-join mondrian
简介:我见过的MDX连接的大多数示例都涉及加入相对较小的集合,例如每个集合数十或数百个项目.但我发现自己也想尝试加入(特别是"非空加入")集合,每个集合包含数千或数万个项目,到目前为止它还不能正常运行.我想知道这是否可以使用,或者我是否需要考虑使用除Mondrian/OLAP之外的其他东西.
具体来说,我有一个记录公司(n = 7000)和客户(n = 27000)之间互动的立方体.目前公司和客户都是完全扁平化的层次结构; 有所有级别和个人 - 公司级别,其间没有其他级别.有一个中央事实表,以及公司和客户的单独维度表.
我的用户至少似乎想要沿着这些方向获取摘要报告,聚合公司和客户之间的所有非空交互:
select
[Measures].[Amount] on columns,
NonEmptyCrossJoin([Firm].Children,
[Client].Children) on rows
from MyCube
Run Code Online (Sandbox Code Playgroud)
但是这个查询及其变体在我的测试Mondrian设置中不起作用.要么我得到一个OutOfMemoryException(在2GB的Java堆上),要么Java似乎花了不可思议的长时间在mondrian.rolap.RolapResult $ AxisMember.mergeTuple(TupleCursor).(如果有帮助的话,我可以提供更完整的堆栈跟踪.)"不可思议的长"我的意思是Java在我放弃之前会在数小时内停留在查询中.
我最初的预期上面的查询进行确定,因为从概念上讲它可以做一定程度的只是在做沿着这些路线的SQL查询有效:
select Firm, Client, Sum(Amount) as n
from fact, firm, client
where fact.firmid = firm.firmid and fact.clientid = client.clientid
group by Firm, Client
Run Code Online (Sandbox Code Playgroud)
(事实上,如果我直接在MySql中执行这样的操作,则执行时间不会超过15秒.)
但是从调试日志来看,Mondrian似乎没有尝试这种优化.相反,它似乎是在内部进行连接,并且最终变得特别慢.我在我的mondrian.properties中设置了mondrian.native.crossjoin.enable = true,但这似乎不是Mondrian能够"生成本机"的连接类型之一.(如果我打开mondrian.native.unsupported.alert = ERROR,那么我得到相应的异常.)
我想知道我是否需要阻止我的用户尝试加入如此大的尺寸/集合,或者Mondrian是否可能不是我在这里寻找的工具.但也许我只是做错了什么.
我来回答OLAP的部分。OLAP 工具共有三大系列。ROLAP、MOLAP 和 HOLAP。
ROLAP,Relational,建立在关系数据库之上。如果缓存丢失,MDX 请求将使用 SQL 语句在关系数据库中执行。它们通过延迟具有可扩展性的优势,但取决于它们在底层数据库上的性能。QoS 可能很棘手,因为它是数据库 QoS。
MOLAP,InMemory,将数据复制到内部结构(内存)中。这里的 QoS、应答时间更加稳定和更快,因为所有处理都在同一台服务器中完成。MOLAP 的问题是可扩展性,因为您可能会出现内存不足 (>100mio) 的情况。
HOLAP 是 ROLAP 和 MOLAP 的混合体。我没有直接的经验,但从理论上讲,它们可以带来两全其美的效果。
从这些数字来看,使用 MOLAP 工具您应该不会遇到任何问题,它实际上是一个小立方体。
因此,在离开 OLAP 世界之前,给 MOLAP 服务器一个机会。有关 OLAP 服务器的列表,您可以查看维基百科