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返回表中取其他的数据。联合索引也是类似,但是联合索引最好控制在两个字段内,不然开销太大,因为索引都是需要排序的,对插入操作影响太大。
转载于:https://www.cnblogs.com/huasky/p/8303853.html
相关资源:Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解 (黄玮) 高清PDF扫描版