区
区(extent)的概念
- 对于 16KB 的页来说,连续的 64 个页就是一个区,也就是说一个区默认占用 1MB(16*64=1024KB) 空间大小。无论是系统表空间还是独立表空间,都可以看成是由若干个连续的区组成的,每 256 个区被划分成一组。每个组的最开始的几个页面类型是固定的。
- 在表中的数据量很大时,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区为单位进行分配。
区的 4 种状态
- FREE:空闲的区
- FREE_FRAG:有剩余空闲页面的碎片区
- FULL_FRAG:没有剩余空闲页面的碎片区
- FSEG:附属于某个段的区
XDES Entry
每一个区都对应着一个 XDES Entry 结构,这个结构记录了对应的区的一些属性。
- Segment ID (8 字节):每一个段都有一个唯一的编号,用 ID 表示。Segment ID 字段表示的就是该区所在的段,前提是该区已经被分配给某个段了,不然该字段的值没有意义。
- List Node(12 字节):这个部分可以将若干个 XDES Entry 结构串连成一个链表。
- State(4 字节):这个字段表明区的状态。
- Page State Bitmap(16 字节):这个部分共占用 16 字节,也就是 128 位。一个区默认有 64 个页,这 128 位被划分为 64 个部分,每个部分有 2 位,对应区中的一个页。这 2 个位中的第 1 位表示对应的页是否是空闲的,第 2 位还没有用到。
段
段的概念
- 段是一些零散的页面以及一些完整的区的集合。
- 存放叶子节点的区的集合就算是一个段(segment),存放非叶子节点的区的集合也算是一个段。也就是说一个索引会生成两个段:一个叶子节点段和一个非叶子节点段。
- 碎片(fragment)区:在一个碎片区中,并不是所有的页都是为了存储同一个段的数据而存在的,碎片区中的页可以用于不同的目的,比如有些页属于段 A,有些页属于段 B,有些页甚至不属于任何段。碎片区直属于表空间,并不属于任何一个段。
- 为某个段分配存储空间的策略
- 在刚开始向表中插入数据时,段是从某个碎片区以单个页面为单位来分配存储空间的。当某个段已经占用了 32 个碎片区页面之后,就会以完整的区为单位来分配存储空间。
- 当某个段已经占用了 32 个碎片区页面之后,就会以完整的区为单位来分配存储空间(原先占用的碎片区页面并不会被复制到新申请的完整的区中)。
INODE Entry
每个段都定义了一个 INODE Entry 结构,如下图所示:
未完待续…