关于Oracle优化策略

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

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,这样可以释放一些资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值