登录 / 注册
IT168信息化频道
IT168首页 > 信息化 > 信息化评论 > 正文

崔华:基于Oracle的SQL优化案例分析

2013-04-19 13:54    it168网站原创  作者: 申安安 编辑: 申安安

  【IT168 现场报道】2013年4月18-20日,第四届中国数据库技术大会(DTCC 2013)在北京福朋喜来登酒店拉开序幕。在为期三天的会议中,大会将围绕大数据应用、数据架构、数据管理(数据治理)、传统数据库软件等技术领域展开深入探讨,并将邀请一批国内顶尖的技术专家来进行分享。本届大会将在保留数据库软件应用实践这一传统主题的基础上,向大数据、数据结构、数据治理与分析、商业智能等领域进行拓展,以满足于广大从业人士和行业用户的迫切需要。

  自2010年以来,国内领先的IT专业网站IT168联合旗下ITPUB、ChinaUnix技术社区已经连续举办了三届数据库技术大会,每届大会超过千人规模,云集了国内技术水平最高的数据架构师、DBA、数据库开发工程师、研发总监、IT经理等,是目前国内最受欢迎的数据库技术盛会。

崔华:基于Oracle的SQL优化案例分析
▲2013 DTCC大会现场报道

  2013年中国数据库技术大会第二天的“Oracle架构与优化”专场中,来自中航信资深Oracle数据库工程师崔华为大家分享了《基于Oracle的SQL优化典型案例分》主题演讲。从演讲的内容来看,这是一次非常实用的技术分享。据资料显示,崔华从2004年开始从事DBA工作,拥有 Oracle 数据库技术各个领域的经验。除了工作外,崔化在博客上撰写大量的文章并在Oracle活动中进行演讲,此外还与他们合作撰写三本专业图书,《Oracle DBA手记 2》、《Oracle DBA手记3》和《海量数据库解决方案I》。

崔华:基于Oracle的SQL优化案例分析
▲中航信资深Oracle数据库工程师崔华

  Oracle优化从理论说起:SQL优化方法论

  提到Oracle的优化,太过理论性质的内容无需赘述,崔华先生简单为与会者分享了3个方面,分别是:

  ·Oracle里的SQL优化实际上是基于对CBO和执行计划的深刻理解

  ·Oracle里的SQL优化不能脱离实际的业务

  ·Oracle里SQL优化需要适时使用绑定变量

  提起CBO不得不多说两句,ORACLE 早先提供了CBO、RBO两种SQL优化器。CBO在ORACLE7 引入并不断深入,而同时9i以后版本中基本上都是基于CBO的优化。

  崔华认为SQL优化最有技术含量的部分不在于你通过种种手段(比如重新收集统计信息等)调整了目标SQL的执行计划、缩短了其执行时间、解决了该SQL的性能问题,而是在于你要知道CBO为什么在一开始会选错执行计划,你要知道CBO选错执行计划的根本原因。

  深入分析很多案例后发现很多问题的原因都有一定共性,在本次演讲的案例显示导致CBO评估出对一个实际数据量为730多万且统计信息准确的大表S_EVT_ACT执行全表扫描操作后的成本值仅为2,其原因是参数OPTIMIZER_MODE的值在session级别被修改成了FIRST_ROWS_10,这同时也是导致上述坐席登陆慢的问题多次不间断出现的根本原因。 而对于这种问题的改进方法崔华建议:

  • 修改各个session中对于参数OPTIMIZER_MODE的设置,将其值修改为默认值ALL_ROWS

  • 如果不能在session级修改参数OPTIMIZER_MODE的值,我们还可以使用SQL Profile。在上述18个表关联SQL中加入Hint(即/*+ index(T18 S_EVT_ACT_P1) */),并用加入Hint后改写SQL的执行计划替换原SQL的执行计划

  引实例讲方法

  在下面的SQL语句中包含了IN,而IN之后的括号内是一个包含视图的子查询(即select grppolno from v_bc_lcpol where polno = ‘9022000000000388’),它不是一个常量的集合,所以Oracle这里不能对该SQL做“IN-List Iterator”和“IN-List Expansion /OR Expansion”;

崔华:基于Oracle的SQL优化案例分析

  上述SQL中的视图V_BC_LCGRPPOL和V_BC_LCPOL均包含了集合运算符UNION ALL,所以Oracle这里也不能对该SQL做视图合并;于是Oracle现在就只剩下了两条路可走:要么对该SQL走FILTER类型的执行计划(即“IN-List Filter”),要么对该SQL做子查询展开。

  而把sql语句改写以后,效果则会发生巨大的变化:

崔华:基于Oracle的SQL优化案例分析

  从这个例子的解决过程我们可以看出,虽然最后的解决方法很简单,但这其实完全倚赖于我们对Oracle如何处理SQL语句中的IN、子查询展开、视图合并和连接谓词推入的深刻理解

标签: 性能优化
相关文章
  • IT168企业级IT168企业级
  • IT168文库IT168文库

扫码送文库金币

编辑推荐
系统架构师大会
系统架构师大会
点击或扫描关注
IT168企业级微信关注送礼
IT168企业级微信关注送礼
扫描关注
首页 评论 返回顶部