- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于Oracle的SQL优化-SQL优化方法论概要
基于Oracle的SQL优化 -SQL优化方法论 崔华(dbsnake) @dbsnake 《基于Oracle的SQL优化》 第一章 Oracle里的优化器 第二章 Oracle里的执行计划 第三章 Oracle里的Cursor和绑定变量 第四章 Oracle里的查询转换 第五章 Oracle里的统计信息 第六章 Oracle里的Hint 第七章 Oracle里的并行 第八章 Oracle里SQL优化的方法论 SQL Tuning Methodology Oracle里如何做SQL优化 Oracle里SQL优化的方法论 Oracle里SQL优化的方法论在实战中的验证 SQL Tuning Goals Oracle数据库里SQL优化的终极目标就是要缩短目标SQL语句执 行时间。要达到上述目的,我们通常只有如下三种方法可以选择: 降低目标SQL语句的资源消耗 并行执行目标SQL语句 平衡系统的资源消耗 Reduce the Workload “方法1:降低目标SQL语句的资源消耗”以缩短执行时间,这是最常用的SQL优化方法。这种方法的核心是要么通过在不更改业务逻辑的情况下改写SQL来降低目标SQL语句的资源消耗,要么不改SQL但通过调整执行计划或相关表的数据来降低目标SQL语句的资源消耗 Reduce the Workload 我们在“第四章 Oracle里的查询转换”中曾经提到过一个案例,在 那个例子里,我们在不更改原有业务逻辑的情况下通过将目标 SQL由原语句: select pubamnt from v_bc_lcgrppol where grppolno in (select grppolno from v_bc_lcpol where polno = 9022000000000388); 改写为: select pubamnt from v_bc_lcgrppol a,(select distinct grppolno grppolno from v_bc_lcpol where polno = 9022000000000388) b where a.grppolno=b.grppolno; 后就实现了将原SQL的逻辑读从200万降低到了6,其执行时间也 从6秒降低到了毫秒级这样一个极好的优化效果 Reduce the Workload 方法1所涉及到的这两种优化手段在Oracle数据库中能否奏效以及效果的好坏与否很大程度上取决于对CBO和执行计划的理解程度,对CBO和执行计划理解的越深,这两种优化手段的应用就会越纯熟,效果就会越好。这也是这本书所要提出的Oracle数据库里SQL优化方法论的第一点:Oracle里SQL优化的本质是基于对CBO和执行计划的深刻理解 Reduce the Workload 在很多人眼里,SQL优化就是走索引,就是用走索引来取代全表扫描。实际上这种认识是非常肤浅的。 是,大部分SQL优化的问题都可以通过增加或者减少索引的方式来解决,但这绝不是全部! Reduce the Workload 例1:用合适的索引来避免不必要的全表扫描 例2:用合适的索引来避免不必要的排序 例3:用合适的函数索引来避免看似无法避免的全表扫描 例4:重新设计索引来避免不必要的全表扫描 用合适的索引来避免不必要的全表扫描 create index idx_t1 on t1(object_id); select * from t1 where object_id is null; 用合适的索引来避免不必要的全表扫描 drop index idx_t1; create index idx_t1 on t1(object_id,1); 用合适的索引来避免不必要的排序 drop index idx_t1; select * from (select object_name,object_id from t1 order by object_id desc) where rownum4; 用合适的索引来避免不必要的排序 create index idx_t1 on t1(object_id); 用合适的函数索引来避免看似无法避免的全表扫描 drop index idx_t1; create index idx_t1 on t1(object_name); select object_name,object_id from t1 where object_name like %EMP; 用合适的函数索引来避免看似无法避免的全表扫描 select object_name,object_id from t1 wh
文档评论(0)