这篇文章是在一本书上看到的,并加上自己的理解,和大家一起分享。。。
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,这样可以释放一些资源。