这周一直在做一个需求,是关于ORACLE性能优化方面的,针对这种情况,这周也看了不少的资料,在此,也写点自己的想法。
没做这个需求以前,一直认为SQL优化无非就是把SQL语句做一点修改,转换,也就能达到目标了,但是现在看来自己还是太天真了。SQL优化的基础知识包括优化器,执行计划,Cursor,绑定变量,查询转换,统计信息,Hint和并行等各方面。
ORACLE里的SQL优化的本质是基于对CBO和执行计划的深刻理解,终极目标当然是缩短目标SQL语句的执行时间,基于上述目的,我们通常只有如下三个方法可以选择:
(1)降低目标SQL语句的资源消耗
(2)并行执行目标SQL语句
(3 )平衡系统的资源消耗
其中方法一十最常用的SQL优化的方法,这种方法的核心在于不改变业务逻辑的基础上来降低目标SQL语句的资源消耗,,要么不改写SQL但通过调整执行计划或相关表的数据来降低目标SQL的资源消耗。通过修改而优化执行计划后,目标SQL的执行时间往往能降低好几个数量级。对CBO和执行计划的理解程度,对CBO和执行计划理解得越透彻,优化手段的应用就会越成熟。
在很多人的眼里,SQL优化就是走索引,就是用走索引类取代全表扫描,我以前也是这么认为的,但是这是非常肤浅的。
首先,在ORACLE数据库中,不是说走索引就一定比走全表扫要好,这跟表的大小和索引的连接方式很大的关系,比如说,很多情况下走索引的嵌套循环连接的执行效率往往比不上走全表扫描的哈希连接的执行效率;
其次,SQL优化通常都是通过调整执行计划来达到优化的目的,用走索引来取代全表扫描只是对执行计划调整中的一种;
最后,即便是走索引,也会有一些额外的变化,如果对CBO和执行计划理解不深刻,不了解这些变化,即便走了索引,也可能没有效果。
今天就说这些,下周要真正的上战场了,下周进一步细讲!