Oracle:常规SQL语句优化

首先,可以了解一下一段SQL语句块的执行顺序:

1、from:给定数据源

2、where:指定取数限制条件

3、group by:根据指定列对数据进行分组

4、聚合函数计算

5、having:对分组后的数据进行筛选

6、表达式的计算

7、select:查询所需数据

8、order by :根据指定字段进行排序

9、limit:限时查询记录数

from部分优化

1、避免对大表进行全表扫描,尽量减少对表的查询次数

2、对数据量级大的表使用分区存储,从而提高查询效率

3、多表连接:

选择合适的多表连接方式,且适当减少多表连接操作

避免无约束条件的全表连接,避免对大表进行交叉连接造成笛卡尔积

主表的选择,通常是最先且以全表扫描的方式被访问的表,只有两张表都建立了索引,优化器才能按照“紧随from关键字后面的为主表”的规则来对待

where部分优化

1、where子句中避免对字段进行表达式计算以及使用函数

2、where子句的连接顺序:oracle采用自下而上的顺序解析where子句,因此可以过滤掉最大数据记录的条件必须写在where子句的末尾,也就是在表进行连接前过滤的记录越多越好

3、对where子句频繁使用的列、经常基于某列进行排序操作、多表连接列上建立合适的索引,加快查询速度(但要避免一表上建多个索引,索引会占用额外的存储空间,会降低查询速度)

4、当子查询查询结果集较多时,用[not] exists。当子查询后面的括号内是列表或子查询所满足的结果集很小时可以使用[not] in

--若子查询结果集较多,前一个执行效率大于后一个
select * from emp where exists (select ename from bonus where comm is not  null and ename = emp.ename);
select * from emp where ename in(select ename from bonus where comm is  not null) ;

select部分优化

1、少用‘select *’来代替所有列名
2、聚合函数的使用:对有主键约束的列,count(column)最快;对没有主键约束且表中有多个列的,count(1)最快;对没有主键约束且表只有一列的,count(*)最快(count(1)、count(*)不会忽略空值)

其他优化

1、清除表数据用truncate代替delete
delete会将被删除的数据写到回滚段(或撤销表空间)中,而truncate则不会
2、在保证完整性的情况下多用commit语句
在PL/SQL块中,经常将几个相互联系的DML语句写在一个begin……end块中,在每个块的end前面使用commit语句,可以实现对象DML语句的即使提交,同时也释放事务所占用资源
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值