赞
踩
首先,你可以理解oracle库中的表是有版本号的。每次commit之后,表的版本号是会发生变化的。
对于读操作来说,采用的是一致性读的方式,只会读取事务开始时,最新的版本号的内容。
对于更新操作来说,采用的当前读的方式:需要更新的数据是当前最新的版本得数据,会按当前最新的字段数据进行匹配。而不是事务开始时的那个版本的内容进行匹配。
有个问题需要关注:
如果有个开启了很久的事务,突然执行了select操作,那么它将会利用undo信息得到历史版本状态下的内容。注意这个版本号越旧需要的undo信息就会越多。
B*树索引:
非唯一索引:索引值+rowid
唯一索引:索引值
rowid: 行数据所在的内存地址。
位图索引:
原理:和倒排序的原理相识,用一张二维表去记录字符串在哪些记录id中出现过哪些记录id中没有出现,出现过的标记为1,没有出现过的标记为0.
适用场景:相异基数小的字段,比如性别,不适合用在OLTP类型的表中,不适用在高写入的场景,触发更新操作时,会锁定该位图索引类型的所有的行。用在OLAP场景是比较好的。
函数索引:
对函数处理后的结果值进行索引。
1. redo日志:就是重做日志,用途:数据备份,数据恢复,oracle中主要有两类重做日志,一类是在线重做,一类是归档重做。
归档重做日志:是在线重做日志的副本,在线日志满时,会将其同步到归档日志中。
在线重做日志:至少有两组,先写组1,组1写完再写组2
2. undo日志,与redo日志正好相反,它是需要回到更改前的状态;rollback会使用到undo日志,一致性读的时候也会使用到undo日志。
3. rollback, 撤销之前事务中所做的所有修改;释放锁资源
前:
修改数据;生成redo日志分;生成undo日志
后:
生成SCN:系统改变号,用于保证事务的顺序;将缓存中的redo日志刷到磁盘中。
1.查看执行计划 以PLSQ为例
下面4个值:基数,字节数固定的sql理论上来说值应该是固定的;消耗和时间,应该是越小越好。
基数(Rows):Oracle估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle估计的当前操作所需的时间
2.查询的细节需要看description
表查询方式:
a.table access full 全表扫描
b.table access index rowid 通过rowId来取(rowid oracle自动添加 可以快速定位目标数据,索引B*(特点:多分支,有序,非叶子节点有指向兄弟节点的指针,叶子节点间有双向列表结构)数结构的叶子节点中存放了rowId)
c.索引扫描:
INDEX UNIQUE SCAN(索引唯一扫描) 数据量小
INDEX RANGE SCAN(索引范围扫描) 数据量中
INDEX FULL SCAN(索引全扫描) 数据量大,有排序;场景:1.只查询唯一索引字段的时候;2. 使用唯一索引进行排序的时候
INDEX FAST FULL SCAN(索引快速扫描) 速度比full scan快,没有排序 使用count的时候会用到
INDEX SKIP SCAN(索引跳跃扫描)前提条件:表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件
a. 列表分区:根据时间日,月,年之类的,无法实现自增
d. 区间分区:根据时间日,月,年之类的,可以实现分区自增 by range interval(自增关键字)
c. hash分区:适用于列值无法确定的情况,适用在userId,部门编码这样的字段,by hash,不能自增
d. 复合分区:可以构建子分区的
注意:分区必须配合本地local索引才能起作用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。