2013数据库大会:崔华-基于Oracle的SQL优化案例分析

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

2013数据库大会:崔华-基于Oracle的SQL优化案例分析_第1张图片
▲中航信资深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";

2013数据库大会:崔华-基于Oracle的SQL优化案例分析_第2张图片

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

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

2013数据库大会:崔华-基于Oracle的SQL优化案例分析_第3张图片

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

转载自: http://cio.it168.com/a2013/0419/1474/000001474420.shtml

你可能感兴趣的:(2013数据库大会:崔华-基于Oracle的SQL优化案例分析)