1 2 3 4

sql优化

from后的表名

oracle的解析器按照从右到左的顺序处理from子句中的表名
因此from子句中写在最后的表将被最先处理
在from 子句中包含多个表的情况下,你必须选择记录条数最少的表放在最后

例如:

表 TAB1   16384 条记录 
表 TAB2   1 条记录 
选择 TAB2作为基础表 (最好的方法) 
select count(*) from tab1,tab2 执行时间 0.96秒
选择 TAB2作为基础表 (不佳的方法) 
select count(*) from tab2,tab1 执行时间 26.09秒 

where后的表名

将可以过滤掉最大数量记录的条件
写在where子句的末尾
解释器先执行后面语句

表中loanacno=ln001能匹配到4条数据
表中currsign='CNY'能匹配到15000条数据

select * from F_LN_LOAN_INFO
where loanacno='ln001'
and currsign='CNY'

会先匹配currsign='CNY',找到了15000条数据,然后会在这15000条数据中进行loanacno='ln001'的查找

select * from F_LN_LOAN_INFO
where currsign='CNY' 
and loanacno='ln001'

会先匹配loanacno='ln001',找到了4条数据,然后会在这4条数据中进行currsign='CNY'的查找

用>=替代>

两者的区别在于

deptno>=3,解释器会直接跳到第一个deptno等于3的记录
而deptno>2,将首先定位到deptno=2的记录,并且向前扫描到第一个大于2的记录

使用instr代替like操作符

遇到需要用到like过滤的sql语句,可以使用instr代替

--搜索ename包含S的记录
select ename from emp where ename like '%S%';
select ename from emp where instr(ename,'S')>0;

--搜索ename不包含S的记录
select * from emp where ename not like '%S%';
select * from emp where instr(ename,'S')=0;

--搜索以S开头的记录
select * from emp where ename like 'S%';
select * from emp where instr(ename,'S')=1;

--搜索以s结尾的记录
select * from emp where ename like '%S';
select * from emp where instr(ename,'S')=length(ename)-length('S')+1;

--查看ename第四位是T的记录
select * from emp where ename like '_L%';
select * from emp where instr(ename,'L',1,1)=2

用exists替代in

用in的sql语句总是多了一个转换的过程

减少对表的全表扫描

减少from子查询个数,将重复出现的子句优化成一个临时结果

posted @ 2020-03-28 16:04  多走多看  阅读(251)  评论(0编辑  收藏  举报