- 1、本文档共75页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
oracleSQL性能优化剖析
SQL调优原则-相关原则 1) SELECT子句中避免使用 ‘ * ‘ 当你想在SELECT子句中列出所有的COLUMN时,使用动态 SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 2)使用表的别名(Alias)时在每一个字段前加上表别名 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. 3)Oracle10G 以后版本数据库,请使用CBO优化器,并定时对表和索引进行分析。在经常查询的列上建立索引。 4)用Where子句替换HAVING子句。 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。 select col1,count(col1) from SQLTRAIN_A group by col1 having col110; select col1,count(col1) from SQLTRAIN_A where col110 group by col1; SQL调优原则-相关原则 5)在含有子查询的SQL语句中,要特别注意减少对表的查询。 select B.COL1,b.col3,b.name_b from SQLTRAIN_B Bwhere b.col1 in (select col2 from SQLTRAIN_C C where c.col3=10) and b.name_b in (select name_c from SQLTRAIN_C C where c.col3=10); 替换为: select B.COL1,b.col3,b.name_b from SQLTRAIN_B B where (b.col1,b.name_b) in(select col2,name_c from SQLTRAIN_C C where c.col3=10); Update语句也可以写出类似方式: update SQLTRAIN_B B set (b.col1,b.name_b)=(select col2,name_c from SQLTRAIN_C C where c.col3=10 and c.col3=b.col3 and rownum=1) where b.col3=10; 6)子查询中,如根据ID查名称,请加上rownum=1的条件。 select sb.obj_id,sb.bdz,(select bdz.bdzzj from mw_app.mwt_ud_sbd_bdz bdz where bdz.obj_id=sb.bdz and rownum=1) bdzmc from mw_app.mwt_ud_sbd_sb sb SQL调优原则-相关原则 7)用NOT EXISTS替代NOT IN 在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历)。? 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. select B.COL1,b.col3,b.name_b from SQLTRAIN_B B where b.col3 not in (select col3 from SQLTRAIN_C C where c.col2=10) 替换为:select B.COL1,b.col3,b.name_b from SQLTRAIN_B B where not exists (select 1 from SQLTRAIN_C C where c.col2=10 and b.col3=C.COL3) 8)避免在索引列上使用计算 WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。 select count(*) from SQLTRAIN_C where col3*10 100 替换为:select count(*) from SQLTRAIN_C where col3 100/10 特别对于日期字段,千万不要对日期字段to_char。而是应该对后面的时间to_date。 如: fxrq between to_date(2010-09-06,yyyy-mm-dd) and to_date(2010-09-06 23:59:59,yyyy-
文档评论(0)