【IT168 现场报道】2013年4月18-20日,第四届中国数据库技术大会(DTCC 2013)在北京福朋喜来登酒店拉开序幕。在为期三天的会议中,大会将围绕大数据应用、数据架构、数据管理(数据治理)、传统数据库软件等技术领域展开深入探讨,并将邀请一批国内顶尖的技术专家来进行分享。本届大会将在保留数据库软件应用实践这一传统主题的基础上,向大数据、数据结构、数据治理与分析、商业智能等领域进行拓展,以满足于广大从业人士和行业用户的迫切需要。
自2010年以来,国内领先的IT专业网站IT168联合旗下ITPUB、ChinaUnix技术社区已经连续举办了三届数据库技术大会,每届大会超过千人规模,云集了国内技术水平最高的数据架构师、DBA、数据库开发工程师、研发总监、IT经理等,是目前国内最受欢迎的数据库技术盛会。
2013年中国数据库技术大会第二天的“Oracle架构与优化”专场中,来自中航信资深Oracle数据库工程师崔华为大家分享了《基于Oracle的SQL优化典型案例分》主题演讲。从演讲的内容来看,这是一次非常实用的技术分享。据资料显示,崔华从2004年开始从事DBA工作,拥有 Oracle 数据库技术各个领域的经验。除了工作外,崔化在博客上撰写大量的文章并在Oracle活动中进行演讲,此外还与他们合作撰写三本专业图书,《Oracle DBA手记 2》、《Oracle DBA手记3》和《海量数据库解决方案I》。
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”;
上述SQL中的视图V_BC_LCGRPPOL和V_BC_LCPOL均包含了集合运算符UNION ALL,所以Oracle这里也不能对该SQL做视图合并;于是Oracle现在就只剩下了两条路可走:要么对该SQL走FILTER类型的执行计划(即“IN-List Filter”),要么对该SQL做子查询展开。
而把sql语句改写以后,效果则会发生巨大的变化:
从这个例子的解决过程我们可以看出,虽然最后的解决方法很简单,但这其实完全倚赖于我们对Oracle如何处理SQL语句中的IN、子查询展开、视图合并和连接谓词推入的深刻理解