mondrian.olap.ResourceLimitExceededException:蒙德里安错误:要读取的成员数超出限制(10,000)

Posted

技术标签:

【中文标题】mondrian.olap.ResourceLimitExceededException:蒙德里安错误:要读取的成员数超出限制(10,000)【英文标题】:mondrian.olap.ResourceLimitExceededException: Mondrian Error:Number of members to be read exceeded limit (10,000) 【发布时间】:2020-10-03 14:25:04 【问题描述】:

我遇到了一个类似于 Pentaho 博客在下面帖子中报告的问题:

https://forums.pentaho.com/threads/47819-Help-regd-member-restriction/?p=141499

而且那个查询很简单:

MDX: SELECT NON EMPTY [Measures].[QTD_EMPRESAS] on 0, NON EMPTY [BAIRRO.BAIRRO_H].[TODOS_BAIRRO_H],[BAIRRO.BAIRRO_H].[06], [BAIRRO.BAIRRO_H].[061] on 1 FROM [V_DM_EMPRESAS_LOCALIDADE] WHERE [BAIRRO_F.BAIRRO_H].[06],[BAIRRO_F.BAIRRO_H].[061]

如果我使用一个过滤器,它会成功返回,但是使用两个过滤器,就像上面的查询一样会发生错误。两个过滤器加起来最多 200 条记录,低于错误中报告的限制。

维度BAIRRO有10000多条记录,但我只过滤了两个BAIRRO。

发生错误:

Caused by: mondrian.olap.ResourceLimitExceededException: Mondrian Error:Number of members to be read exceeded limit (10,000)
    at mondrian.resource.MondrianResource$_Def11.ex(MondrianResource.java:1180)
    at mondrian.rolap.SqlMemberSource.getMemberChildren2(SqlMemberSource.java:993)
    at mondrian.rolap.SqlMemberSource.getMemberChildren(SqlMemberSource.java:891)
    at mondrian.rolap.SqlMemberSource.getMemberChildren(SqlMemberSource.java:864)
    at mondrian.rolap.NoCacheMemberReader.getMemberChildren(NoCacheMemberReader.java:179)
    at mondrian.rolap.RolapCubeHierarchy$NoCacheRolapCubeHierarchyMemberReader.readMemberChildren(RolapCubeHierarchy.java:970)
    at mondrian.rolap.RolapCubeHierarchy$NoCacheRolapCubeHierarchyMemberReader.getMemberChildren(RolapCubeHierarchy.java:1027)
    at mondrian.rolap.NoCacheMemberReader.getMemberChildren(NoCacheMemberReader.java:159)
    at mondrian.rolap.RolapSchemaReader.internalGetMemberChildren(RolapSchemaReader.java:186)
    at mondrian.rolap.RolapSchemaReader.getMemberChildren(RolapSchemaReader.java:169)
    at mondrian.rolap.RolapSchemaReader.getMemberChildren(RolapSchemaReader.java:162)
    at mondrian.olap.DelegatingSchemaReader.getMemberChildren(DelegatingSchemaReader.java:78)
    at mondrian.olap.fun.AggregateFunDef$AggregateCalc.getChildCount(AggregateFunDef.java:571)
    at mondrian.olap.fun.AggregateFunDef$AggregateCalc.optimizeMemberSet(AggregateFunDef.java:490)
    at mondrian.olap.fun.AggregateFunDef$AggregateCalc.optimizeChildren(AggregateFunDef.java:398)
    at mondrian.olap.fun.AggregateFunDef$AggregateCalc.optimizeTupleList(AggregateFunDef.java:252)
    at mondrian.rolap.RolapResult.<init>(RolapResult.java:314)
    at mondrian.rolap.RolapConnection.executeInternal(RolapConnection.java:662)
    at mondrian.rolap.RolapConnection.access$000(RolapConnection.java:52)
    at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:613)
    at mondrian.rolap.RolapConnection$1.call(RolapConnection.java:611)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

为了避免这个错误,我在 Mondrian 模式中配置了 Role,在 HierarchyGrant 配置中我将 rollupPolicy 设置为 false。

这真的是一个好策略吗?还是有更好的?

【问题讨论】:

【参考方案1】:

角色和层次结构授予是为了安全,所以我不会设置它们,除非您需要它们来进行数据访问控制。

您的 mondrian.result.limit 配置设置似乎设置得太低,为 10,000。为了优化 Mondrian 性能,我将从这个 mondrian.properties 开始并从那里调整设置:

https://github.com/pentaho/pentaho-platform/blob/master/assemblies/pentaho-solutions/src/main/resources/pentaho-solutions/system/mondrian/mondrian.properties

【讨论】:

感谢您的回答。我根据您的方向调整了 mondrian.properties,但执行查询仍然有错误。某些查询会产生超时错误。通过错误堆栈跟踪和调试,我了解到在计算总列时会出现问题,其中对维度的每条记录执行查询,从而克服了查询或超时的限制。多维数据集架构中是否有任何配置可以提供帮助?尤其是作为总列? 我必须查看您的堆栈跟踪才能知道问题所在。查询可能因多种原因超时,包括 SQL 速度慢、单元格太多、复杂的 MDX 表达式、mondrian.properties 设置等。您可以尝试使用单元格批量大小(请参阅其中的注释)来调整 Segment.load 查询。仅供参考,Pentaho 9.2 将包括许多查询计划执行和日志记录改进,以帮助调试性能问题。

以上是关于mondrian.olap.ResourceLimitExceededException:蒙德里安错误:要读取的成员数超出限制(10,000)的主要内容,如果未能解决你的问题,请参考以下文章