6

总结:我见过的大多数 MDX 连接示例都涉及连接相对较小的集合,例如每个集合包含数十或数百个项目。但我发现自己也想尝试加入(特别是“非空加入”)集合,每个集合都有数千或数万个项目,但到目前为止效果不佳。我想知道这是否可以工作,或者我是否需要考虑使用 Mondrian/OLAP 以外的东西。

具体来说,我有一个记录公司 (n=7000) 和客户 (n=27000) 之间交互的多维数据集。目前,公司和客户都是完全扁平的层次结构;有所有级别和个人公司级别,中间没有其他级别。有一个中心事实表,以及针对公司和客户的单独维度表。

我的用户至少似乎希望获得这些方面的摘要报告,汇总公司和客户之间的所有非空交互:

select
  [Measures].[Amount] on columns,
  NonEmptyCrossJoin([Firm].Children,
                      [Client].Children) on rows
from MyCube

但是这个查询及其变体在我的测试蒙德里安设置中不起作用。要么我得到一个 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

(实际上,如果我直接在 MySql 中执行这样的操作,执行时间不会超过 15 秒。)

但从调试日志来看,蒙德里安似乎并没有尝试这种优化。相反,它似乎是在内部进行连接,并且最终速度特别慢。我在我的 mondrian.properties 中设置了 mondrian.native.crossjoin.enable=true,但这似乎不是 Mondrian 能够“使本地化”的连接类型之一。(如果我打开 mondrian.native.unsupported.alert=ERROR 那么我会得到相应的异常。)

我想知道是否需要阻止我的用户尝试加入如此大的维度/集合,或者 Mondrian 是否可能不是我在这里寻找的工具。但也许我只是做错了什么。

4

4 回答 4

2

我不是 100% 确定,但您是否尝试过设置:

mondrian.native.nonempty.enable = true

这种优化似乎将一些这样的操作推到了 sql 级别 - 听起来它可能会有所帮助。

于 2012-04-02T14:29:16.997 回答
2

为了跟进,我尝试在 Sql Server Analysis Services (Sql Server 2008) 中设置一个类似的多维数据集,似乎 icCube 对不同的 OLAP 工具的执行方式有所不同:

甚至在我深入了解 SSAS 最佳实践之前,这种类型的 MDX 的性能就已经有了很大的提高。沿着这些方向查询

select
  [Measures].[Amount] on columns,
  NON EMPTY
  crossjoin([Firms].[Firm Name].Children,
            [Clients].[Client Name].Children)
  on rows
from MyCube

从在 Mondrian 中无法生存到在 Sql Server 下花费大约 10 秒。可以想象,这与 MS 的商业智能开发工作室指导我默认创建 MOLAP 多维数据集有关,或者 SSAS 有一个更智能的查询计划器。

无论如何,也许这对我来说已经足够快了。如果没有,我还不确定在这种情况下 SSAS 可以得到多少优化。(令人失望的是,即使我第二次重新运行查询,它仍然需要大约 10 秒;我希望缓存可能会产生更显着的效果。)

切线地,您可能会注意到在刚刚引用的 MDX 中,我已将原始的 NonEmptyCrossJoin 替换为结合了 NON EMPTY 的普通交叉连接。这是因为,至少在 Sql Server 世界中,NonEmptyCrossJoin 显然被视为已弃用的不良做法。(这在 Microsoft 的 MDX Language Reference 中有说明。前 SSAS 开发人员之一 Mosha 在一篇名为MDX: NonEmpty, Exists and evil NonEmptyCrossJoin的文章中描述了这种情况. 简短的版本是 NonEmptyCrossJoin 具有令人困惑的语义和有限的应用程序,并且从 Sql Server 2005 左右开始,查询优化器已经足够聪明,可以在没有 NonEmptyCrossJoin 的情况下使您的查询快速。)所以我在上面的 MDX 中替换了一个更现代的认可等价物. (它仍然可以与 NonEmptyCrossJoin 一起使用,尽管 NonEmptyCrossJoin 根本不会加快速度。)

于 2011-11-30T03:25:22.310 回答
1

我会回答OLAP的部分。OLAP 工具有三大家族。ROLAP、MOLAP 和 HOLAP。

ROLAP,Relational,建立在关系数据库之上。如果缓存丢失,MDX 请求将使用 SQL 语句在关系数据库中执行。它们通过延迟具有可扩展性的优势,但取决于它们在基础数据库上的性能。QoS 可能很棘手,因为它是 db QoS。

MOLAP,InMemory,将数据复制到内部结构(内存)中。由于所有处理都在同一台服务器上完成,这里的 QoS 和响应时间更加稳定和快速。MOLAP 的问题是可扩展性,因为您可能会出现内存不足 (>100mio)。

HOLAP 是 ROLAP 和 MOLAP 的混合体。我没有直接的经验,但理论上他们可以两全其美。

看看数字,你应该不会对 MOLAP 工具有任何问题,它真的是一个小立方体。

所以,在离开 OLAP 世界之前,给 MOLAP 服务器一个机会。有关 OLAP 服务器的列表,您可以查看wikipedia

于 2011-11-20T15:04:54.713 回答
0

Mondrian OLAP 不支持大型数据库。

嗯,我正在开发 The Bitmap Join Index OLAP Tool (BJIn OLAP),这是一个基于 Java 开源的 OLAP 工具。这使用 SQL 差异语法,而不是 MDX。

文档在这里

试用版在这里

于 2011-12-13T23:34:37.777 回答