1.选择最有效的表名顺序
oracle的解析器按照从右到左的顺序处理from子句中的表名,因此写在from子句最后的表(基础表,drivingtable)将被最先处理。在from子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
2.where子句中的连接顺序
oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前。
3.select子句中避免使用“*”
当你想在select子句中列出所有column时,使用动态sql列引用‘*’是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,oracle在解析的过程中,会将‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
4.用exists代替in
实际情况看,使用exists代替in效果不是很明显,基本一样。
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行连接。在这种情况下,使用exists或(no exists)通常将提高查询的效率。
5.用表连接替换exists
在子查询的表和主表查询是多对一的情况,一般采用表连接的方式比exists更有效率。
6.用exists替换distinct
当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct,一般可以考虑用exists替换。
exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。因此如果不是特别研究和追求速度的话,查询一个表的数据需要关联其他表的这种情况查询,建议采用exists方式。
7.避免循环(游标)里面嵌查询
游标里面不能嵌入查询(或嵌入游标),其实也不能有update或delete语句,只能有insert语句。但在实际的编程情况下是不可能完全避免的,但我们一定要尽量避免。该类问题也是程序中出现过的问题,该类问题也可以大大提升程序效率,请大家一定注意。
优化的方法是尽量把游标循环中的查询语句放到游标查询中一起查询出来,这样相当于只访问了一次磁盘读到内存;如果放到游标中的话,假如游标有100万数据量,那么程序需要100万次磁盘,可以想象浪费了多少I/O的访问。
如果在程序编写上没有办法避免游标中有查询语句的话(一般情况是可以避免的),那么也要保证游标中的查询使用索引(即查询速度非常快),例如游标100万数据量,游标中的查询语句0.02秒,从这个速度来说是很快的,但总体上看100万*0.02秒=5小时33分钟,如果写一个不够优化的语句1秒,需要多次时间完成?
8.尽量使用union all 替换union
union会去掉重复的记录,会有排序的动作,会浪费时间。因此在没有重复记录的情况下或允许有重复记录的情况,要尽量采用union all来关联。
9.使用decode函数来减少处理时间
使用decode函数可以避免重复扫描相同记录或重复连接相同的表。
10.group by优化
group by 需要查询后排序,进度慢影响性能,如果查询数据量大,并且分组复杂,这样的查询语句在性能上是有问题的。
11.尽量避免使用order by
order by需要查询后排序,速度慢影响性能,如果查询数据量大,排