调整 OBIEE 生成的 SELECT 查询

Posted

技术标签:

【中文标题】调整 OBIEE 生成的 SELECT 查询【英文标题】:Tuning OBIEE generated SELECT queries 【发布时间】:2016-03-17 12:28:31 【问题描述】:

我们将 Oracle 11g 上的数据集市/仓库实现为星型模式。业务报告是使用 OBIEE 设计的。我来自 ETL 背景,对 OBIEE 知之甚少。

OBIEE RPD 设计完成后,我看到 OBIEE 开始在后台生成 SELECT 查询以将数据馈送到报告中。在很多情况下,我注意到 SELECT 查询没有优化(大事实表在单独的 WITH 子句中多次完全扫描)。

当报告性能不佳时,OBIEE 查询会发送给 ETL 团队进行性能调优。我对如何调整它们感到困惑,因为它们是自动生成的。我知道可以选择在 OBIEE 中为每个报告编写自定义 sql(无需通过 RPD),但我们的标准不允许这样做,而且我也认为它没有利用 OBIEE 的优势。

有没有人遇到过类似的问题?如何调整此类查询?

【问题讨论】:

【参考方案1】:

首先,您说得对,自定义 SQL(称为直接数据库查询)原则上不是一个好主意,尽管它有时很有用。但这不是您问题的解决方案。

调优生成的 OBI 查询是 OBI RPD 任务,适用于 OBI 开发人员;为生成的 OBI 查询调整数据库是一项数据库/ETL 任务。但是你不能真正做到一个没有另一个 - OBI 需要被设计为生成合适的查询,并且数据库需要以这样一种方式设计,即可以生成合适的good查询回答所提出的问题。

OBI 基本上是一个 SQL 生成器,如果 RPD 模型是 bad 次优的,那么生成的查询将是 bad 次优的。 OBI 将根据 RPD 中关于数据和数据库的布局和结构的信息生成 SQL。

你显然是从数据库方面来的,所以对你来说 SQL 很糟糕,因为它不是你要写的。数据库设计也可能不利于获得 OBI 被问到的问题的答案。

【讨论】:

感谢 cmets。我明白你的意思。我正在尝试查看是否可以获得更具体的信息 - 是否有任何指标表明 RPD 的设计不适合生成最佳 OBI 查询?同样,是否有任何迹象表明星型模式设计不适合以最佳方式执行 OBI 查询。 @museshad 没有真正的指标,它归结为 RPD/数据库的数据知识和技能。【参考方案2】:

正如jackohug 所说,OBIEE 是一个SQL 生成器,一般的做法是尝试优化OBIEE 生成的查询,而不是尝试更改此查询。不知何故,根据性能问题,您可以尝试一些技巧。 首先,您的表是否已分区,您的报表是否可以从分区中受益? 其次,在事实表上添加索引,以便维度上的任何过滤器都可以有利于对事实表的访问。 第三,构建聚合表,恢复事实表,因此当报告没有显示太多细节时,您首先访问数据少得多的聚合表,并且仅当用户向下钻取结构时(并且这样做时,他们是对他们感兴趣的数据应用过滤器)他们访问非常详细的事实表,但应用过滤器以避免完全扫描。 您还可以告诉 OBIEE 在访问表时使用提示,但与直接数据库查询一样,我不推荐它,我会尝试首先使用前三种方法进行优化。 问候

【讨论】:

谢谢安娜。我会检查你提到的方法。【参考方案3】:

如果您拥有诊断和调整包许可证,则可以运行 SQL Tuning Advisor。 SQL Tuning Advisor 在调优模式下运行优化器,它可能能够生成具有更好执行计划的 SQL Profile。有时,顾问程序也会推荐用于调优的索引。 SQL 配置文件和索引都不需要更改应用程序。

【讨论】:

谢谢罗杰。是的,我知道可以分析执行计划并且可以添加任何索引来提高性能。如果 OBIEE 生成的查询不好怎么办,有没有办法处理呢? 我对OBIEE不熟悉,但是我做了很多从Java到Oracle的对象关系映射。在这种情况下,O-R 映射器偶尔会生成性能不佳的 SQL 和复杂的连接条件。为了解决这些情况,我通常会在 Oracle 端创建一个调整后的连接视图,然后映射到该视图。附带的好处是,如果我将来需要调整查询,我不需要接触应用程序端,只需要接触 Oracle 端。我认为可以在 OBIEE 上使用相同的概念,其中针对视图而不是基表创建自定义查询。 谢谢罗杰。有一种方法可以在 OBIEE 中编写自定义 SQL(就像您的视图一样),但这通常不是一个好的做法,因为一旦您这样做了,您就可以在 OBIEE 中进行其他 RPD 优化(例如:应用任何统计函数)。 沿着这些思路的一个选项可能是通过查询重写来实现一些物化视图,但这是解决症状而不是原因。【参考方案4】:

我还没有在 SQL 调优顾问方面取得很大成功。一些 SQL 调优经验和一些研究通常可以产生更好的计划。

如果所有层都构建良好并且您只需要进行最后的调整,那么在报告的开头添加一个隐藏列(答案/分析)并带有 SQL 提示。

在通过 RPD 层添加提示时我会非常小心,因为其他人会以许多不同的和意想不到的方式加入和使用表。

【讨论】:

以上是关于调整 OBIEE 生成的 SELECT 查询的主要内容,如果未能解决你的问题,请参考以下文章

分析返回错误时如何在OBIEE的日志中看到生成的物理查询进行分析?

FETCH FIRST 65001 ROWS ONLY-OBIEE 11g

OBIEE 和绑定变量

什么是 obiee 中的性能调整以及我们如何解决这个问题的过程是什么?帮我举个例子,谢谢

OBIEE 合并两个查询(连接)

利用select实现年月日三级联动的日期选择效果