oracle优化

本文介绍了Oracle数据库中提高SQL查询效率的方法,包括合理使用通配符、选择合适的查询方式、利用索引、避免使用<>操作符、使用decode函数等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

带通配符(%)的like语句

当通配符在搜寻词首出现时,orale将不使用该字段的索引,但在词尾出现时还是会使用索引的

order by语句

任何在order by语句的非索引项或者有计算表达式都会降低查询速度


第一种格式是使用IN操作符

...where column in ( select * from ... where ... );

第二种格式是使用EXIST操作符

...where exists (select 'X' from ... where ... )

后者比前者数据快很多


select ... from emp where dept_no not in (select dept_no from dept where dept_cat='A')

select ... from emp E where not exists (select 'X' from dept D where E.dept_no=D.dept_no and d.dept_cat='A' )


<>操作符

不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描

a<>0改为a>0  or  a<0

a<>''  改为 a>''


select * from employee where salary<>3000;

select * from employee where salary<3000 or salary>3000;

第二种查询方案会比第一种查询方案更快些,第二种查询允许oracle对salary列使用索引,而第一种查询不能使用索引


如一个表有100万记录,一个数值字段A,30万记录的A=0,30万记录的A=1,

39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,

因为A>2时oracle会先找出为2的记录索引再进行比较,

而A>=3时oracle则直接找到=3的记录索引


union操作符

union在进行表链接后会筛选掉重复的记录

所以在不会产生重复记录的情况下使用 union all

select * from b_gs

union all 

select * from b_ds


select子句中避免使用*,oracle在解析的过程中,会将*依次转换成所有的列名


使用decode函数来减少处理时间

使用decode函数可以避免重复扫描相同记录或重复连接相同的表

select count(*) ,sum(sal) from emp

where dept_no=0020 and ename like 'smith%'


select count(*),sum(sal) from emp

where dept_no=0030 and ename like 'smith%'


select count(decode(dept_no,0020,'X',null)) as D0020_count,

count(decode(dept_no,0030,'X',null)) as D0030_count,

sum(decode(dept_no,0020,sal,null))  as D0020_sum,

sum(decode(dept_no,0030,sal,null)) as D0030_sum

from emp where ename like 'smith%'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值