关于ORACLE优化:
Plsql优化:
1. 大表在前,小表在后
2. Where 表之间的关联在前面,限定条件在后
3. 避免使用*,会转换成所有列名,浪费时间
4. 用exists代替in,not exists 代替not in
5. 用exists代替distinct
6. 尽量用表连接代替exists
7. 减少对多表的查询
8. 避免循环里面嵌查询
9. 尽量用union all代替union,因为union会去重
10. 用decode函数减少处理时间
11. Group by 会在查询后排序,速度影响性能,需要优化
12. 尽量少使用order by
13. 用where代替having
14. 使用表的别名,防止column歧义
15. 删除重复记录
16. 控制commit的上传的时间点,逐条上传和最后上传都不是最优解,注意提交次数和提交数据量的平衡关系
17. 减少表的关联,关联的越多,速度越慢
索引使用优化:
在实际的系统中,索引引起的问题占到绝大多数
1. 避免在索引列山使用函数计算,这样的话查询条件不会使用索引,可以把函数用在条件上,如果无法避免在列上使用函数,那么可以建立基于函数的索引,这是特殊情况,一般尽量少使用。
2. 避免改变索引的类型:
如果索引的类型不匹配,则不能使用索引:
例如:
不使用索引
Select * from ac01 where aac001=10001000;
使用索引
Select * from ac01 where aac001=’10001000’;
3. 尽量避免使用not,!=等,可以用not exists代替或者是in也行
4. 用>=代替>,虽然效果不太明显,但是建议采用这种方式
5. 关于带通配符%的like语句,前面有%的时候,不走索引
不走索引:
Select * from a where a.b like ‘%xxx%’;
走索引:
Select * from a where a.b like ‘xxx%’;
6. 组合索引的问题:
a) 如果索引是建立在多个列上的,只有第一个列被引用,整个索引才会被启用,所以,组合索引尽量按照引用的顺序来建,
b) 复合索引的列引用越多,查询速度越快
7. 自动选择索引,当表中有两个以上的索引时,Oracle只会选择其中一个,如果有一个唯一性索引和其它非唯一性索引,Oracle会选择唯一性索引,让系统选择多个索引,解决这种情况的方法是简历复合索引。
8. 关于索引的建立:
索引的建立肯定会大大的提高查询的速度,但是索引也是一种速度,也存在用户类型的表空间下的,索引建的越多,占用的空间也越大,如果一个表有过多的查询,必然会影响insert,delete和update索引列的速度,因为这些操作改变了整个表的索引顺序,Oracle需要进行调整,这样性能就下降了。
例如:
某项目数据转换,采用游标循环insert的方式,总共2000万的数据,总共用了4个小时,原因就是目标表里面有很多索引。解决方法是先删除索引再执行转换脚本,结果不用1小时就完成了,建立全部的索引不到半个小时。
原因就是第一种方式每次insert都改变索引顺序,共执行改变2000万次,而第二种方式整体上执行索引顺序就一次
PLSQL程序性能问题:
Expain Plan分析索引使用:
输入sql,执行,会在下麦呢显示解释计划,从解释计划上能看到哪条语句使用了索引,哪个没有,那些事全表扫描(TABLE ACCESS FULL),
1. 分析内容说明:
COST:根据优化程序的基于开销的方法所估计出的操作开销值对于使用基于规则方法的语句该列为空该列值没有特定的测量单位它只是一个用于比较执行规划开销大小的权重值
Cardinality:根据基于开销的方法对操作所访问行数的估计值
Bytes:根据基于开销的方法对操作所访问字节的估计
通过设置,我们还能看到更多的信息,例如:CPU使用、时间等等
全表扫描的(TABLE ACCESS FULL)肯定是速度慢的,如果是大数据量的表,那么这个语句是绝对影响性能的。
另外使用了索引也不一定性能就高,因为索引使用也有效率的情况,下面列出索引常见的使用类型:
1. INDEX UNIQUE SCAN:唯一索引扫描,速度最快
2. INDEX RANGE SCAN:范围索引扫描,使用这个索引时,就需要看COST、Cardinality、Bytes的大小了,如果特别大,有时候还可能速度低于全表扫描的速度。
我们在知道语句有问题,或者我们对语句进行优化时,这个工具是非常有用的。