Oracle的数据存储结构
- 表空间(tablespace)--Oracle中最大的逻辑存储单位
- 数据文件(data file)--表空间物理存储载体
- 段(segment)--Oracle中所有占用空间的对象的总称
- extend--段的组成单位
- 数据块(data block)--extend的组成单位,是Oracle存储和数据操作的最小单位。
数据块
数据块是Oracle存储和数据操作的最小单位,但不一定和操作系统的os块相同,一个数据块可能有多个os块构成。
数据块的存储属性
PCTFREE (percent free)
为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update;即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期。
PCTUSED (percent used)
当数据块的剩余空间达到PCTFREE之后就不可以insert了,但是进行的delete操作和update操作会释放数据块的空间,如果数据块的空间释放到了PCTUSED之后就可以开始insert数据了。
行链接和行迁移
行迁移——update操作引起的
当一条记录被更新时,数据库引擎首先会尝试在它保存的数据块中寻找足够的空闲空间,如果没有足够的空闲空间可用,这条记录将被拆分为两个部分,第一个部分包括指向第二个部分的rowid,该部分任然保留在原来的数据块中,第二个部分包含所有的具体数据,将保存到另外一个新的数据块中,这个就成为行迁移。
为什么不将整行都放到新的数据块中? 原因是这样会导致该行数据rowid发生变化,而rowid被存储在索引中,也有可能被客户端临时保存在内存中,rowid的变化可能导致查询错误。该行不仅存了本行id还有新行的id。相当于存入了指针,并且保留了头指针。
行链接——insert操作或者update操作引起的
行链接和行迁移不同,行链接是当一条记录太大,在一个数据块中无法存入,这时会被拆分为2个或以上的部分,存储在多个块中,这多个块之间会构造一个链
行链接的原因则可能为:
- 直接插入大的记录;
- 更新记