oracle sql优化笔记

时间:2022-03-17 16:34:09

oracle优化一般分为:
1、sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的)
A、oracle的sql语句的条件是从右往左执行的,如下语句:select * from t_user where nation='回族' and age > 20.oracle首先是查询年龄大于20岁的,再查询民族为回族的,最后汇总两次得到的结果。
B、根据A中说的sql语句执行特点,上面的语句是可以进行优化的。A中的sql语句查询条件不同可能会有不同的情况,见下面分析:
I、查询条件为:nation='回族' and age > 20,先执行age>20,年龄大于20的数据很可能会很多;
II、查询条件为:age > 20 and nation='回族' , 先执行nation='回族' ,民族为回族的数据可能会比较少(相对年龄大于20的情况,毕竟回族是少数民族嘛);
III、假如I和II中的第一次查询用时差不多,那么第二次查询时,是在数据很多的时候查民族为回族的速度快了,还是在数据很少的时候查年龄大于20的快呢?这个可以根据实际情况尝试下。
C、如果age字段建立了索引(下面会说索引),那就将索引字段的查询条件放最右端,我曾尝试过,大量数据情况下,速度会提高很多,甚至可能都不敢相信的那种。
其实,每个表的每条记录都有一个rowid(还有rownum,这2个的区别后面会说),rowid可以类似的理解为对象的内存地址,有这个地址就能找到对应的信息。
2、存储过程(这可能也不叫优化吧,是自己实践中,临时想到的一个方法,算是一种思路吧)
如果一条sql语句非常复杂(多表关联,数据量庞大等情况),这种sql一般性能都非常的差,可以考虑将复杂的sql拆分成简单的sql语句。但是开发的过程中执行只能执行一条sql语句,怎么办?那就可以用存储过程来编写,存储过程返回需要的结果集即可。同时存储过程是在数据库里面,pl/sql developer工具可以很方便的进行测试调试获取的结果集是否正确,这样比起将sql放在后台来说,测试、维护方便得多。我有次写过一条多表关联的复杂sql语句,经过自己尝试,发现这个多表关联的语句中,有个表的单位字段加上索引就会让这条语句执行只花几秒,但是客户现场该字段不能建索引(原因这里不提了),导致这条sql执行起来要1分钟左右。后来我把这条sql语句写成存储过程,最后得到返回结果集所花时间为不到2秒。具体做法如下:
A、就拿下面语句作为示例:select a.username,a.age,b.name as sexname,c.name as addrname from t_user a join t_sex b on a.sexcode=b.code join t_addr c on a.addrcode=c.code where a.age>20 and a.sexcode='m' and a.addrcode='xiamen'; 实际情况的复杂语句比这个复杂多了,这里暂时先拿这个简单的语句来说明。
B、建立几张事务临时表,并把事务临时表(这些表也可以做其他模块计算数据等用途)上面的部分字段建立索引。针对A中的语句,建立2张临时表,一张表存性别信息(其中code字段建立索引),一张表存住址信息(其中code字段建立索引),最后张表是存返回的结果集。
C、首先将复杂sql语句中需要用到的各个表的数据插入对应临时表中,再查询得到最终结果。针对A中的语句,首先将t_sex表中性别为m的数据插入性别临时表中(这个语句很简单吧?),再将地址表中厦门的地址的记录插入地址临时表中,最后通过查询性别临时表、地址临时表和t_user表得到最终结果。这样得到结果集的速度可能快很多,因为t_sex和t_addr表没有索引,数据量大的情况,查询起来特别慢
上面的举例因为表比较简单,可能也不够恰当。但是我想说的是,复杂的sql,特别是关联查询时非常耗时的操作。所以首先可以想到将复杂的数据化成多条简单的语句,再使用oracle其他优化方法(比如上面示例中使用到了索引和事务临时表)进行优化,这样很可能会大幅提高sql性能。
3、索引
索引类似书的目录,我们一看目录,就知道想看的内容在哪页了。可以大概这么理解:索引存的是表每行记录所在的磁盘地址,通过索引查询,就很快知道了查询数据所在磁盘哪些地方,如果没有索引,那就只能在磁盘中一条条查找了,有索引减少了io次数,自然提高了查询数据。但是每次向表添加(删除、更新操作类似情况)数据后,就要将新增记录所在的地址添加到索引中,这样就会导致新增数据的时候速度变慢。大概这么解释吧,为了能看懂,不一定完全正确。知道了索引,我们就可以在表上面添加适当的索引来提高查询语句的性能。
可以将索引看成一张独特的表,sql查询时,如果字段是索引字段就会使用索引进行查询,此时就会先查索引这张独特的表,再去查询屋里表,所以不是将表的每个字段都变成索引字段就会提高查询效率,同时索引会影响插入数据的性能,所以建议索引需要看场合。
4、分区表
如果一个表的数据量太大,查询起来,肯定速度会慢,这时候可以考虑将普通表做成分区表,当然分库也是不错的办法,但是有时候分库对数据的操作很不方便,什么是分区表,网上资料很多,就不说了。