Oracle学习(十三)优化专题
一、查询频繁,数据量大
索引
使用时机:表中经常查询的字段可以考虑添加索引。
- 联合索引:若能确认多个条件会同时使用时,可以将这几个条件作为联合索引。
- 单列索引:若条件查询时,这几个条件不是同时用到的话,还是单列做索引比较好些。
例子:
如:id,name,income三列需要做索引
查询时同时使用:联合索引要比单列索引要快。
查询时只用到一部分:单列索引要比联合索引快,但是实际上联合索引还是要比没有索引快。
- 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引, 否则该索引将不会被使用。且尽可能的让字段顺序与索引顺序相一致。
- 若某列中存在大量重复数据(如状态,支付类型等列),那么建立索引对效率没啥影响。
- 在定义primary key或unique约束后系统自动在相应的列上创建索引。
用select 具体列代替 select *
- 查询时哪怕很多列也不要使用select*这种写法,这样会全表扫描。
- 应该是用到哪列就在哪列上面加入索引,然后查询时,写清楚要select的列,这样可以调用到对应列的索引,效率会高很多。
二、查询条件注意事项
null值处理
使用时机:当某列可能存在空值时,考虑使用默认值。
PS:在 where 子句中对字段进行 null 值判断,将导致引擎放弃使用索引而进行全表扫描!
例子: select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num = 0
OR、!=、<>、like 优化
使用时机:当查询中的过滤条件存在这几种过滤方式时,会导致引擎放弃使用索引而进行全表扫描,可以考虑以下优化方案。
例子:OR优化:
select id from t where num=10
union all
select id from t where num=20
LIKE优化:
尽量不要在where条件中使用两边都是%的like模糊查询,这样会导致全表扫描,实在不行在字段后面进行模糊匹配。如like 'li%'
IN 优化
使用时机:当查询中用到in的条件进行过滤时,可以考虑以下优化方案。
例子:IN优化:
对于连续的区间数据:使用between
select * from t_order where id between 2 and 3
对于不连续连续的区间数据:使用exists
select num from a where exists(select 1 from b where num=a.num)
三、字段类型的选择
字符型优化
1、若某列只存在数值型的数据,则该列的类型应设置为数值类型,这会降低查询和连接的性能,并会增加存储开销。
2、尽可能的使用 varchar(可变长度) 代替 char (固定长度),因为首先可变长度字段存储空间小,可以节省存储空间。
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
四、新增、修改优化
勤用commit
多使用commit来释放回滚点,对性能会有所提升,出错回滚时数据量也会相对少很多。
五、删除操作
删除操作有3种,先简单了解一下
drop table
1)属于DDL
2)不可回滚
3)不可带where
4)表的结构和内容都删除
5)删除速度快
使用时机:不再需要一张表的时候,用drop
truncate table
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快
使用时机:保留表而删除所有数据的时候用truncate
delete from
1)属于DML
2)可回滚
3)可带where
4)根据where对表内容删除
5)删除速度慢,需要逐行删除
使用时机:想删除部分数据行时候,用delete,并且带上where子句
六、SQL书写
使用大写
Oracle服务器总是先将小写字母转成大写后,才执行,所以使用大写时能减少Oracle的一步操作。