Oracle sql 优化
Oracle sql优化笔记:
看了网上的一些sql优化资料,对于数据库新手来说,看资料能获得
的sql优化技能短时间是很难掌握的,只有在实践中不断总结,才能
掌握自己的优化思路。
优化思路可以罗列以下几点:
1。学会辨知讹传。
引用一句话,网上流传的名人名言百分之八十都是假的”——亚拉
伯罕·林肯。学习新知识的时候,要用追根溯源的精神去看待事物
,而不是听到什么就相信什么,实践见真知。
eg.:oracle10g版本以前,是基于规则的时代,之后是基于代价的时
代。
10g前【select count(*) from 大表,小表】和【select count(*)
from 小表,大表】语句,前者的速度会更快,因为解析是从后向前
,from子句的最后一个表为基础表,基础表越小,执行速度越快。
(多表的笛卡尔积,一行多列,多列一行,当然是一行数据执行的
快,产生的会话少)
10g后,select count(*) from 大表,小表】和【select count(*)
from 小表,大表】语句,两者执行速度一样,后台已有算法去得到
基于代价的优化方式(RBO)。
2。要具备少做事的意识
少做事在数据库上体现在全局临时表;分区表;递归函数的调用;
集合写法;只select自己需要的列而不是*等等。。。
3.学会依据场景选择技术
4.需求最小化(sql尽量只做满足需求的事情,不做额外操作)
5.牢记sql改造等价性
6.充分了解需求是顶级优化
除了优化思路外,熟悉数据库的各个模块的工作方式也至关重要。
以索引为例:
1.索引黄金三大特性:高度较低(可快速定位);存储列值(可优化聚合);本身有序(可优化排序)
2.索引的结构图,以包含(Index entry header,Key column length,Key column value,ROWID)为最小单元。生成一个记录索引信息的二叉树(物理结构图)。查询的时候取深度优先的查询方式最快找到查找的数据。
3.创建索引的时候,顺序取出索引列及对应的rowid,保存在内存中,然后取出一定数量的数据存放在oracle空闲的block块中(取决于一个block能存放的数据量)
5.tips:一个概念
物理读:CPU需要的数据在内存中找不到,那么久必须去物理磁盘上获取,产生物理I/O,叫做一次物理读。
逻辑读:CPU需要的数据在内存中被找到,数据被从内存中传入CPU
逻辑读=即时读+一致读
即时读(当前读):得到块来实际更新要修改的行,所完成的获取就是当前读。当前读读块加的锁与一致读加的锁不同
一致读:发现要修改的行时,所完成的获取就是当前读。
6.distinct默认排序耗时很长,能确定表中的数据没有重复的,一定别用,代价很大。
7.union 语句也会去除重复,默认排序,索引也无法消除排序。
8.回表
回表:意思就是返回实际表中取记录,select字段中有除索引列之外的数据,就需要先从索引中找到对应数据的rowid,然后通过rowid返回表中取其他的数据。联合索引也是类似,但是联合索引最好控制在两个字段内,不然开销太大,因为索引都是需要排序的,对插入操作影响太大。