从Oracle11.2.0.4 升级到Oracle19.17.0.0 后有标量子查询的sql 执行变慢。
经过排查是标量子查询转换导致的执行计划改变所致。
影响执行计划改变的参数_optimizer_unnest_scalar_sq,可以通过/*+OPT_PARAM('_optimizer_unnest_scalar_sq' 'false')*/ 的hint 来修正,
或者在标量子查询的select 部分使用/*+no_unnest*/,都能解决问题。 如果有很多类似SQL, 建议在系统级关闭:
alter system set "_optimizer_unnest_scalar_sq"=false;
此参数在11g版本中是不存在的, 可以进行关闭不会有影响。
实验:
建表:
create table test_o as select * from dba_objects;
create table test_u as select * from dba_users;
1. 无索引对比
查询sql:
SELECT
u.username,
(SELECT MAX(created) FROM test_o o WHERE o.owner = u.username) as max_created
FROM test_u u;
执行计划,执行时间0.21s

添加hint , 执行时间0.51s,确实比开启标量子查询时要慢。

2. 建立索引后对比
无hint执行时间0.18s

添加hint 执行时间0.14s, 添加索引后不开启标量子查询转换时会快。

最后修改时间:2023-04-23 16:44:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




