添加 where 条件使 MDX 查询变慢(olap4j)

Posted

技术标签:

【中文标题】添加 where 条件使 MDX 查询变慢(olap4j)【英文标题】:add where condition make MDX query slow (olap4j) 【发布时间】:2015-11-11 22:09:31 【问题描述】:

我在 Java Web 应用程序中使用 MONDRIAN 服务器和 OLAP4j API,在我的查询附近添加 where 时出现性能问题。 MDX 查询如:

SELECT 
   CrossJoin(
     [Product.ProductHierarchie].[AllProduct]
   , [Measures].[Quantity]
   ) ON COLUMNS,
   [Client.ClientHierarchie].[AllClient].Children ON ROWS
FROM [sales_data_cube]

0.3 秒完成。但是当添加 where 子句时,例如 WHERE ([Period].&[start_period]:[Period].&[end_period]), 要获得开始/结束期间之间的销售额,查询需要 250 秒 和一个小型事实表(8500 行)。

我应该怎么做才能有更好的表现?

应用程序在内存限制 = 8GB 的​​ tomcat 服务器上运行,数据库服务器:mysql 5.6.17

【问题讨论】:

而不是WHERE 子句尝试将其移动到像这样的子选择 - FROM ( SELECT [Period].&[start_period]:[Period].&[end_period] ON 0 FROM [sales_data_cube] ) Mondrian 无法识别 subselect 子句,它不支持 MDX 子查询。 【参考方案1】:

最后,问题出在蒙德里安的配置上。 Mondrian 使用日志记录包 (log4j) 在每次使用 where 条件比较两个对象时实际调用“调试”方法。

解决方案是更改 log4j 配置并停止 'Debug'-mod。在创建 OLAP 连接之前,我添加了这个简单的代码来设置 log4j:

Logger.getRootLogger().setLevel(Level.OFF);
Logger.getRootLogger().removeAllAppenders();
Logger.getRootLogger().addAppender(new NullAppender());
Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
Connection connolap = ...

more details about this issue (Mondrian Slow MDX Query)

【讨论】:

虽然我没有使用 olap4j 的经验,但我非常感谢您回到这里并添加一个经过充分研究的答案。当人们这样做时,它确实为网站增加了价值。

以上是关于添加 where 条件使 MDX 查询变慢(olap4j)的主要内容,如果未能解决你的问题,请参考以下文章

WHERE 子句中的 MDX 除外函数

where 子句中的 MDX '不等于'

使用具有一个条件的 WHERE 子句运行 100 个 SQL 查询,还是使用具有 100 个条件的 WHERE 子句的一个查询更好?

SSAS MDX WHERE 子句语法 - 从同一层次结构中过滤多个值

基于条件的 MDX 查询到数据透视表

如何为 Amazon redshift 数据库编写查询,使相关查询的 where 子句具有两个条件?