oracle优化

 

带通配符(%)的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%'

 

你可能感兴趣的:(oracle,sql,优化)