【问题标题】:Performance issues with outer joins to view in Oracle 12c在 Oracle 12c 中查看外部联接的性能问题
【发布时间】:2017-09-30 00:50:07
【问题描述】:

我的两个客户最近升级到Oracle 12c 12.1.0.2。自从升级以来,我在使用带有外连接的视图的查询上遇到了显着的性能下降。下面是一个简单查询的示例,它在旧的Oracle 11g 11.2.0.2 数据库上运行几秒钟,但在新的12c 数据库上运行几分钟。更令人困惑的是,此查询在 12c 数据库之一上运行得相当快(但不是那么快),但在另一个数据库上则根本不运行。 12c 数据库的性能非常糟糕,以至于我开发的报告无法使用。

我比较了11g 和两个12c 数据库之间的索引和系统参数,并没有发现任何显着差异。但是,Execution Plans 之间存在差异。在11g 上,外连接表示为VIEW PUSHED PREDICATE,但在12c 上,它表示为HASH JOIN,没有PUSHED PREDICATE

当我在12c 数据库上的查询中添加提示/*+ NO_MERGE(pt) PUSH_PRED(pt) */ 时,性能在几秒钟内。

在我们的Crystal Reports 中,向 SQL 添加提示不是一个选项(至少我不这么认为,而且有几份报告),所以我希望我们能弄清楚为什么在一个 12c 上性能是可以接受的数据库,但不在另一个数据库上。

我和我的团队对接下来要尝试什么感到困惑,尤其是为什么两个 12c 数据库之间的响应如此不同。我们在12c 中研究了几篇关于性能下降的文章,但似乎没有什么特别适用于这个特定问题。作为补充说明,使用表而不是视图的查询在可接受的时间范围内返回结果。任何见解或建议将不胜感激。

查询:

select pi.*
, pt.*
from policyissuance_oasis pi
, policytransaction_oasis pt
where 
pi.newTranKeyJoin = pt.polTranKeyJoin(+)
and pi.policyNumber = '1-H000133'
and pi.DateChars='08/10/2017 09:24:51'    -- 2016 data
--and pi.DateChars = '09/26/2016 14:29:37'  --2013 data
order by pi.followup_time

【问题讨论】:

  • 这些图片不可读。请从问题中删除位图并使用简单文本格式附加您的查询。还请附加问题视图的定义作为文本,而不是位图。还请附上解释计划,作为文本而不是位图。要以文本格式生成解释计划,请使用以下步骤顺序:EXPLAIN PLAN FORM select .... your query 然后SELECT * FROM table(DBMS_XLAN.display),然后复制最后一个查询的结果作为文本并将其粘贴到问题中。跨度>
  • 感谢您的 cmets,@krokodilko。一旦我能找出正确的格式,我将添加请求的文本对象!抱歉,我是新手!
  • 您是否收集了统计数据?我知道这个问题听起来很傻,但只是为了检查......
  • 我们需要查看您的表和索引定义。
  • 您必须运行EXPLAIN PLAN FOR query...,然后立即运行SELECT * FROM table(DBMS_XPLAN.display)。如果你在任何其他命令之间运行,那么你会得到一个错误。请阅读the documentation of EXPLAIN PLAN

标签: sql oracle


【解决方案1】:

正如 krokodilko 所说,执行以下操作:

explain plan for 
select pi.*
, pt.*
from policyissuance_oasis pi
, policytransaction_oasis pt
where 
pi.newTranKeyJoin = pt.polTranKeyJoin(+)
and pi.policyNumber = '1-H000133'
and pi.DateChars='08/10/2017 09:24:51'    -- 2016 data
--and pi.DateChars = '09/26/2016 14:29:37'  --2013 data
order by pi.followup_time;
select * from table(dbms_xplan.display());

然后,您可能会在计划的底部看到这一点:

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

那里,

动态采样

概念应该是性能问题关注的中心(level=2 是默认值,范围在 0-11 之间)。

事实上,引入动态采样 (DS) 是为了提高优化器生成良好执行计划的能力。此功能已得到增强并重命名为Dynamic Statistics in Oracle Database 12c。最常见的误解是DS 可以用作优化器统计的替代品,而DS 的目标是增强optimizer statistics;当regular statistics 不足以获得高质量的基数估计时使用它。

对于串行 SQL 语句,dynamic sampling level

optimizer_dynamic_sampling

参数,但请注意,从Oracle Database 12c Release 1 的存在SQL plan directives 也可以在编译查询时启动dynamic statistics 收集。这是自适应统计的一个特性,由数据库参数控制

optimizer_adaptive_features (OAF)

Oracle Database 12c Release 1

optimizer_adaptive_statistics (OAS)

Oracle Database 12c Release 2

换句话说,从Oracle Database 12c Release 1(我们在办公室也使用db12.1.0.2)开始,如果通过将相关参数设置为TRUE来启用某些自适应功能,则将使用DS

串行语句通常运行时间很短,编译时的任何DS 开销都会对整体系统性能产生很大影响(如果语句经常被硬解析)。对于匹配此配置文件的系统,建议设置OAF=FALSEalter session set optimizer_adaptive_features=FALSE 注意

你不应该改变系统而是改变会话

)。

对于Oracle Database 12c Release 2 onwards,建议使用默认的OAS=FALSE

Parallel statements 通常更占用资源,因此通常值得在编译时投资额外的开销以潜在地找到更好的SQL execution plan

对于serial type SQL statements,您可以尝试手动设置optimizer_dynamic_sampling 的值(假设没有相关的SQL 计划指令)。如果我们要针对具有并行属性集的较大表发出类似样式的查询,我们可以看到动态采样开始了。

什么时候应该使用dynamic sampling?当您知道由于复杂的谓词而导致执行计划不佳时,通常建议使用DS。但不应该像我之前提到的那样是系统范围的。

什么时候使用dynamic sampling不是个好主意? 如果查询编译时间需要尽可能快,例如,不重复的OLTP 查询,您无法在多次执行中分摊额外的编译成本。

最后,对于您的情况,设置 对于单个 SQL,optimizer_adaptive_features 参数为 FALSE 语句并查看获得的结果。

【讨论】:

  • 感谢您的 cmets Barbaros!我能够按照您的指示捕获计划结果。我已经用文本输出更新了我的帖子。不幸的是,我没有数据库的 DBA 权限,但我正在与我们的 DBA 一起审查和应用您的建议。我会尽快通知你结果。
  • 我能够按照您的指示捕获计划结果,但是我无法使用文本输出更新我的帖子,因为它添加了太多字符(有 260 行输出)。请让我知道是否有某个部分更有用。
【解决方案2】:

我们发现了性能问题的原因。 DBA 在系统级别更改了以下 2 个系统参数,用于使用我们客户的 Oracle 服务器的主应用程序:

_optimizer_cost_based_transformation = OFF 
_optimizer_reduce_groupby_key = FALSE

当我们在会话级别将它们更改为以下内容时,上面连接 2 个视图的查询会在不到 2 秒的时间内返回结果:

alter session set "_optimizer_cost_based_transformation"=LINEAR;
alter session set "_optimizer_reduce_groupby_key" = TRUE;
COMMIT;

更改此参数对性能没有影响:

alter session set optimizer_adaptive_features=FALSE;
COMMIT;

我们还发现,更改以下参数可以进一步提高更复杂视图的性能:

alter session set optimizer_features_enable="11.2.0.3";
COMMIT;

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2020-05-25
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2017-02-21
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多