关于Oracle优化策略

来源:互联网 发布:配送拆分直销系统源码 编辑:程序博客网 时间:2024/06/04 18:16

这篇文章是在一本书上看到的,并加上自己的理解,和大家一起分享。。。

Oracle采用两种方式扫描表:

a,全表扫描。这种方式下,oracle会从表的第一个记录按顺序扫描查找数据。

b,采用rowid。这种方式下,oracle采用索引的方式,实现rowid和数据的物理位置之间的联系。通常采用索引可以提高查询速度,但是索引会降低数据的插入和删除速度。因为每次修改数据时,oracle都会重新编排索引。

选择最有效的表名顺序。oracle在处理from字句时,会按照从右到左的顺序处理表,因此最后一个表将被先处理。因此在from字句中有多个表时,需要注意表的顺序。

oracle采用自下向上的顺序处理where子句。因此需要将表连接条件写在其他条件前面,这样可以过滤掉大部分数据。

例如:效率低下的语句

select * from emp e where sal>5000 and job="manager" and 25 <(select count(*) from emp where e.empNo=mgr)

效率高的语句:

select * from emp e where 25<(select count(*) from emp where e.empNo=mgr) and sal>5000 and job="manager"

在select子句中避免使用“*”。oracle在处理“*”时,首先会查询数据字典将“*”转换成对应的列名,这是效率很低下的。

减少访问数据库的次数。当执行每天sql语句时,oracle需要做很多的事情:解析sql语句,估计索引利用率,绑定变量等。因此减少访问数据次数,可以提供效率。

例如:

效率低下的语句:

select * from emp where id=1;select * from emp where id=2;
效率高的语句:

select * from emp where id=1 and id=2

删除重复记录最高效的方法(因为使用了rowId):

delete from emp e where e.rowId=(select min(x.rowId) from emp x where x.id=e.id)
删除表时使用truncate代替delete。但是使用delete删除时,若事物没有被提交,可以恢复删除的数据。但是使用truncate则不可以。因为truncate是ddl语句,而delete是dml语句。ddl语句会自动提交事务。

在程序中尽量多commit,这样可以释放一些资源。