在Oracle 12c中查看外部联接的性能问题

lst*_*ins 5 sql oracle

我的两个客户最近升级到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.

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

在SQL中添加提示不是我们的选择Crystal Reports(至少我不相信,也有几个报告),所以我希望我们可以弄清楚为什么性能在一个12c数据库上是可接受的而在另一个12c数据库上是不可接受的.

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

11g数据库

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
Run Code Online (Sandbox Code Playgroud)

lst*_*ins 0

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

_optimizer_cost_based_transformation = OFF 
_optimizer_reduce_groupby_key = FALSE
Run Code Online (Sandbox Code Playgroud)

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

alter session set "_optimizer_cost_based_transformation"=LINEAR;
alter session set "_optimizer_reduce_groupby_key" = TRUE;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

更改此参数不会对性能产生影响:

alter session set optimizer_adaptive_features=FALSE;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

alter session set optimizer_features_enable="11.2.0.3";
COMMIT;
Run Code Online (Sandbox Code Playgroud)