前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >是什么操作把SQL性能提高了6倍多?

是什么操作把SQL性能提高了6倍多?

作者头像
老虎刘
发布2022-06-22 17:48:46
发布2022-06-22 17:48:46
3160
举报

今天这个案例不看SQL,看优化前后的执行计划就可以了:

优化前,最终返回3096条记录,耗时4146秒(执行时间看第一行中间的timeline):

优化后,最终返回185K记录,耗时653秒:

优化后SQL执行计划没有变化,耗时最多步骤返回的记录数多了,最终返回的记录数也是优化前的6倍多,执行时间却变成了优化前的1/6,到底做了什么优化操作?

欲知后事如何,且听下回分解,给大家留一个思考的时间!

有思路的朋友可以留言讨论。

公众号的原创声明必须够300字,那就补充点其他内容,关于cardinality feedback:

搞优化的人总是喜欢找毛病:昨天看了一篇关于cardinality feedback bug导致SQL出现性能问题的文章,在分析SQL执行计划时使用的是plsql developer工具。其实plsql developer工具作为plsql 开发调试工具来说是非常不错的,但是作为查看执行计划的工具,显示的信息就差很多,补充信息无法显示,用它查看执行计划的唯一的好处就是各执行步骤层次感比较清晰,但是这一点比sql monitor又差很多。

如果是在sqlplus 下,简单的使用dbms_xplan.display_cursor命令,就能比较明确的在note部分看到“cardinality feedback used for this statement”这句话,可以马上证实是cardinality feedback导致的问题。因为,有经验的DBA遇到SQL第二次执行比第一次慢的情况,第一时间就能想到是cardinality feedback 的问题。dbms_xplan.display_cursor如果使用了advanced选项,显示的内容就更丰富了。

老虎刘有一个很简单的cardinality feedback的test case,可以用来测试sql profile工具(使用coe_load_sql_profile.sql脚本):

create table t1 as select * from dba_objects;

create table t4 as select * from t1 sample(10);

create index IDX_OBJID_T4 on t4(object_id);

exec dbms_stats.gather_table_stats(user,'T1');

exec dbms_stats.gather_table_stats(user,'T4');

执行下面sql,第一次快,第二次及以后慢:

select count(*) from t1 left join t4

on t1.object_id=t4.object_id and t1.object_id>0

and (t1.created = t4.created or t1.created=t4.LAST_DDL_TIME);

非常简单的test case,自己动手测试一下吧!这个case在12c没有cardinality feedback的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档