本节包含测试和改进Pentaho Analyzer(Mondrian)性能的建议和程序。Pentaho Analyzer性能有两个方面需要考虑:查询速度和执行速度。
查询速度是指从数据仓库或数据集市中检索数据所需的时间,执行速度是指在检索到数据后处理或执行计算所用的时间。考虑到这两个性能因素,回顾以下在典型的性能调整过程中要问的问题:
-
查找性能问题。问题是否涉及查询速度(检索结果集)或执行速度(在客户端和Mondrian引擎中进行计算)?最常见的情况是,性能问题出现在数据结构中,而不是分析引擎或客户端机器中。
-
如果查询速度较慢,则必须重新考虑数据仓库的设计和实现。
-
如果您的数据仓库设计合理,您是否使用分析数据库来实现最大的查询性能?
-
如果执行速度较慢,您可能需要对Mondrian或Pentaho Reporting引擎进行一些调整。
-
如果高基数维度是不可避免的,那么您可能需要对它们进行分区,并优化您的模式以支持表分区。
优化您的基础架构
本节中的指导方针和建议针对您可以对内部基础设施进行的更改。本节中的性能调整技巧都与修改Pentaho软件无关。在您可以自信地调整分析引擎和Pentaho Analyzer之前,您必须确保等式中的所有内容都得到了适当的优化。
重新设计数据仓库
注意:本节中的建议一般适用于构建和优化数据仓库,并非针对Analyzer。然而,由于糟糕的数据仓库设计经常是Pentaho Analyzer性能损失的重要来源,因此在本节中列出了它。
数据仓库的存在是为了将事务数据整合和划分为一个精简、有组织、规范的源,用于报告和分析。数据仓库设计中应遵循的一些准则如下:
-
对修改原始设计持开放态度,以满足业务用户调整后的需求(迭代设计)。
-
删除业务用户实际未使用的数据。
-
为正确的目的进行优化。基本上有两个用例需要考虑:分析(切片/切块/旋转)和静态报告。您也可以使用数据仓库来清理和整合用于数据挖掘的事务数据,但这种模型几乎肯定不适合进行分析或报告。
-
避免创建高基数维度(将过多的记录放入事实表中)。高基数维度永远不会表现良好。
-
如果数据仓库中有很多不相关的信息,请考虑将其分解为更特定于主题的数据集市。
-
为大型事实数据表创建索引。
-
为频繁计算的视图创建聚合表。
切换到分析数据库
对于数据仓库和独立数据集市,有些数据库比其他数据库更好。为查询速度而非插入速度设计的数据库最适合存储用于分析的数据。出于这个原因,这种数据库通常被称为分析数据库。例子包括Netezza、InfoBright、Teradata和Greenplum,尽管Pentaho没有特别认可或推荐任何特定的分析数据库。
如果您当前没有使用分析数据库作为ROLAP数据源,并且查询性能较差,那么切换到分析数据库应该是提高Pentaho Analyzer性能的首要考虑因素。
查询优化
索引是查询性能的一个主要因素,也是在不重新设计数据仓库的情况下解决高基数维度问题的一种有效方法。让您的数据库管理员检查您的数据库配置,并确保大型维度和度量值已正确编入索引。
优化Pentaho Analyzer
一旦您正确地调整了数据仓库,就可以继续调整ROLAP模式、Mondrian引擎和Analyzer客户端工具。
划分高基数维度
如果您无法避免创建高基数维度,那么您必须制定一种策略,在不减少其大小的情况下提高它们的性能。通常,数据库会对大的表进行分区,这使得查询一个分区成为一项快速操作。但是,Analyzer引擎无法检测哪些表已分区,哪些表未分区。因此,MDX查询将被转换为过于宽泛的SQL语句,从而导致查询遍历表的所有分区。
要指示Analyzer引擎正确处理(分区的)高基数维度,必须修改ROLAP架构,并在每个适用维度上将ElementCubeDimension元素的highCardinality属性显式设置为true。这将简化分区表的SQL生成;最终,只查询相关的分区,这可以大大提高查询性能。
Mondrian日志分析
要确定Analyzer性能问题,可以查看Analyzer引擎和数据仓库数据库的日志。这将显示有关Analyzer计算中涉及的基础结构以及SQL和MDX查询的信息。DBA应该通过查看数据库日志来执行最初的数据库性能调优工作,确保统计信息是最新的(访问计划是经过计算和合理的),并分析您的使用情况。确保聚合级别基于前50-80个常见用途。
基于此数据进行所有性能调整;它将告诉您关于数据结构中瓶颈的所有需要了解的信息。
您还可以通过Analyzer界面直接查看Mondrian日志信息来确定Analyzer报告中挂起查询的原因:
- 以管理员身份登录BA服务器。
- 创建或加载Analyzer报告。
- 单击报告工具栏中的More actions and options 图标,然后选择 Administration > Clear Cache 点击确定。
- 再次单击图标,然后选择 Administration > XML 点击确定。
- 再次单击图标,然后选择 Administration > Log。
下一步该做什么:打开一个新的浏览器选项卡,其中包含有关打开的报告的日志信息。您可以刷新此页面以实时查看查询进度。以下日志条目是最需要注意的:
-
如果每个SQL查询报告两次。第一次是Mondrian获得第一条记录,第二次是检索所有记录
-
执行时间长的SQL查询
-
返回大量数据(超过1000行)的SQL查询
-
不联接表的SQL查询
-
不包括筛选器的SQL查询
-
此日志条目:WARN mondrian.rolap.RolapUtil无法对“NonEmptyCrossJoin”使用本机SQL求值;原因:不支持参数。如果看到这种情况,请尝试将 contains filter 切换为 includes filter,或者使 contains filter 更有选择性。
为大型数据仓库配置Pentaho Analyzer
Analyzer具有一些低级别配置选项,这些选项将在处理大型数据仓库和高基数维度时提高性能:
- filter.members.max.count=500
- filter.dialog.apply.report.context=false
- filter.dialog.useTopCount=true
- report.request.service.result.expire.time.seconds=30
- report.request.service.result.cleanup.time.seconds=300
下表解释了这些analyzer.properties设置:
属性 | 描述 |
---|---|
filter.members.max.count | 控制要在filter对话框中显示的最大值数,例如包含/排除筛选器和日期范围下拉列表。 |
filter.dialog.apply.report.context | 如果设置为true,则在筛选器对话框中显示可用成员时,Analyzer会将这些成员限制为报表上现有的筛选器或度量值。这意味着,在检索成员列表时,Analyzer将在事实表中执行联接,然后应用维度筛选器。对于高基数维度,这可能会显著减少加载到内存中的成员列表。 |
filter.dialog.useTopCount | 如果this和mondrian.properties中的mondrian.native.topcount.enable都设置为true,则在筛选器对话框中显示第一组成员时,Analyzer将只显示在层次结构中排序的该组成员。对于高基数维度,这是避免将所有成员加载到内存中所必需的。但是,如果用户使用筛选器对话框中的“查找”框,或者您将filter.dialog.apply.report.conf设置为true,则不会使用TopCount。 |
report.request.service.result.expire.time.seconds | 报告结果将在经过此时间后发布。Analyzer报告请求以异步方式处理,并在第一次下载后立即清理。虽然这是有效的,因为客户端通常不需要多次下载报告,但它会导致弹出式阻止程序的问题,该程序会阻止第一次下载,并在提示用户后重新提交下载。如果您在30秒后使请求过期,您将解决弹出窗口阻止程序问题,同时还可以让人们刷新浏览器重新下载报告。这仅适用于PDF、Excel或CSV下载。 |
report.request.service.result.cleanup.time.seconds | 报告结果清理将在该时间段之后进行。 |
为大型数据仓库配置Mondrian引擎
有几个mondrian.properties选项可以控制Analyzer引擎如何与Pentaho Analyzer一起与大型数据仓库交互:
- mondrian.result.limit=5000000
- mondrian.rolap.iterationLimit=5000000
- mondrian.rolap.queryTimeout=300
- mondrian.native.crossjoin.enable=true
- mondrian.native.topcount.enable=true
- mondrian.native.filter.enable=true
- mondrian.native.nonempty.enable=true
- mondrian.rolap.maxConstraints=1000
- mondrian.native.ExpandNonNative=true
- mondrian.expCache.enable=true
下表解释了这些mondrian.properties设置:
属性 | 描述 |
---|---|
mondrian.result.limit | 控制Mondrian将在内存中处理的最大交叉连接大小。理想情况下,任何查询都不应该涉及内存中的大型交叉连接;相反,它们应该由数据库处理。 |
mondrian.rolap.iterationLimit | 这与mondrian.result.limit类似,只是它适用于计算内存中的聚合,如SUM、MAX、AGGREGATE等。应将其设置为与mondrian.result.limit相同的值。 |
mondrian.rolap.queryTimeout | 如果任何查询运行超过此秒数,则该查询将立即取消。处理单个MDX语句的所有SQL语句的总和必须小于此超时。将其设置为零将禁用查询超时,这是不建议的,因为失控的查询可能会剥夺其他必要进程的系统资源。 |
mondrian.native.crossjoin.enable | 如果设置为true,当Mondrian需要交叉联接报表中的多个维度时,如果交叉联接为非空,意味着已经定义了事实表关系,则使用SQL执行联接操作。结果SQL查询只返回实际具有事实数据的组合维度成员。这减少了需要处理的元组数量,对高基数维度的性能至关重要。 |
mondrian.native.topcount.enable | 如果设置为true,则在为筛选器对话框获取第一组记录时,Mondrian将只将该组记录读取到内存中。如果设置为false,则维度级别的所有记录都将被读取到内存中 |
mondrian.native.nonempty.enable | 如果设置为true,则在为筛选器对话框获取第一组记录时,Mondrian将只将该组记录读取到内存中。如果设置为false,则维度级别的所有记录都将被读取到内存中。 |
mondrian.rolap.maxConstraints | 这应该设置为in列表中数据仓库数据库支持的最大值。 |
mondrian.native.ExpandNonNative | 与交叉联接的本机求值结合使用。如果设置为true,Mondrian将把交叉联接输入扩展到简单的成员列表中,这些成员列表是下推的候选者 |
重新设计Analyzer报告以获得最佳性能
一旦您知道了要在Analyzer报告中显示什么,您几乎肯定必须重新设计它以提高性能。因为Analyzer报告基本上是一个操作的分层列表,所以向报告中添加字段和筛选器的顺序会对查询响应时间产生很大影响。尽管这不会改变报告的图形输出,但幕后发生的事情可以更快地显示输出。
当您重新创建报告时,请遵循以下过程以获得最佳性能:
-
先按低基数维度进行添加和筛选
-
向报告中添加度量值
-
最后添加高基数维度
注意:筛选时,始终选择包含/排除而不是包含/不包含。
Modrian缓存控制
您可以控制Pentaho Analyzer引擎用于OLAP数据的缓存基础结构。
文章评论