日期:2014-05-16  浏览次数:20426 次

高级SQL优化(二) ——《12年资深DBA教你Oracle开发与优化——性能优化部分》

目录:

Oracle数据完整性和锁机制 
索引及优化之表分析 
表分析、约束及表间关系 
Oracle体系结构1
Oracle体系结构2 
海量数据库及分区1 
海量数据库及分区2 
海量数据库及分区3 
海量数据库及分区4 
高级SQL优化(一)  
高级SQL优化(二)  
高级SQL优化(三) 常用优化工具 
PPT和源码下载:    http://sishuok.com/forum/posts/list/6365.html
配套视频课程
    Oracle性能优化 http://sishuok.com/product/601 
    海量数据库和高级SQL优化 http://sishuok.com/product/602
 
 
充分利用索引
索引的限制
1. 索引对不等号和NOT的限制
  如果WHERE条件中出现!=或者<>,即使该列建立了索引,则该索引也不会被使用;如果不恰当的使用了NOT,则索引也不会被使用。
Oracle 10g起,在基于CBO的优化器模式下Oralce会进行自动优化,但在基于RBO(基于规则)的优化器模式下,依然保持此规则。
  
 
1. 索引对不等号和NOT的限制
   RBO模式下,执行计划如下:
   
1. 索引对不等号和NOT的限制
   RBO模式下,执行情况如下:
   
 
  此时使用变通写法的耗费为:0.407/2.187=1.60%!
1. 索引对不等号和NOT的限制
   CBO模式下,执行情况如下:
  
 
此时使用变通写法的耗费节约不到0.03秒,但依然更优,故此推荐此种变通写法,再看此时使用NOT:
1. 索引对不等号和NOT的限制
   CBO模式下,在JYJE列的索引上使用NOT:
  
为使用<>的:0.156/0.329=47.42%!为变通写法的使用0.156/0.297=52.53%! 因 此这种写法最优!
 
1. 索引对不等号和NOT的限制
   一般,WHERE条件中,如果索引列是字符列,使用NOT往往也不会使用索引:
  
结论:如果索引列是数字,则对于不等号的处理可以变更为NOT的方式或者(大于 OR 小于)的方式① ;对于确实无法不使用不等号的方式,可以使用默认值② ;如果可以建立位图索引则使用位图索引③ ;否则可以考虑使用分区等方法进行优化④ ,具体是情况而定。
2. 索引对IS NULL的限制
   一般来说,如果WHERE子句基于的列是可空的列,且其建立了索引,如果使用了IS NULL,由于NULL的列本身不包含在索引中,因此无法利用索引。
所以一般对要建立索引的列不要设置为可空,如果确实含有空值,建议使用默认值代替空值,具体参见前面章节“SQL优化技巧”部分的“使用默认值”。
 
3. 索引对函数的限制
基于索引IDX_BIGTAB_OBJECTNAME,执行情况如下: