在标准表中,数据在逻辑上按数据页的列表进行组织。这些数据页根据表空间的扩展数据块大小在逻辑上分组到一起。
例如,如果扩展数据块大小是 4,那么第 0 至 3 页是第一个扩展数据块的组成部分,第 4 至 7 页是第二个扩展数据块的组成部分,依此类推。
在逻辑上,索引页组织成 B 树,这可以有效地找到具有特定键值的表记录。索引页中的项数不固定,而是取决于键的大小。对于数据库管理的空间 (DMS) 表空间中的表而言,索引页中的记录标识(RID)使用相对于表空间的页号,而不是相对于对象的页号。这使索引扫描操作能够直接访问数据页,而不需要扩展数据块映像页(EMP)来进行映射。
每个数据页都具有相同的格式。每一页的最前面都是页头,后面跟着槽目录。槽目录中的每个条目都与该页中的另一个记录相对应。槽目录中的条目代表记录开始位置在数据页中的字节偏移。值为 -1 的条目与已删除的记录相对应。
记录标识由页号及随后的槽号组成(图 2)。索引记录还包含名为 ridFlag 的附加字段。ridFlag 存储关于索引中键的状态信息,例如它们是否被标记为“已删除”。在使用索引来标识 RID 之后,便使用该 RID 来标识正确的数据页以及该页中的槽号。对记录指定 RID 之后,该 RID 在表被重组之前将不会更改。
重组表页时,实际删除记录后在页中留下的嵌入式可用空间将被转换为可使用的可用空间。
DB2® 数据服务器支持不同的页大小。对于有可能按顺序访问行的工作负载,请使用较大的页大小。例如,顺序访问通常用于决策支持应用程序或大量使用临时表的场合。对于有可能随机访问行的工作负载,请使用较小的页大小。例如,在联机事务处理(OLTP)环境中,通常执行随机访问。
DB2 索引使用经过优化的 B 树实现,此实现基于一种进行预写记录的高效率高并行性索引管理方法。B 树索引安排成平衡的页层次结构,从而通过在项被插入或删除时重新排列数据键来最大程度地缩短访问时间。
经过优化的 B 树实现的叶子页包含双向指针,这使单一索引同时支持正向或反向扫描。除进行 90/10 分割(这意味着,索引键的最高 10% 放在新页中)的高键页以外,索引页通常进行对半分割。这种类型的索引页分割对于特定工作负载而言非常有用,这些工作负载的插入操作通常使用新的高键值完成。
只有在已对表挂起 X 锁定的情况下,才会从索引页中除去已删除的索引键。如果无法立即除去键,那么会将其标记为“已删除”而稍后将其除去。
如果在创建索引时已通过对 MINPCTUSED 指定正数值启用联机索引整理碎片功能,那么可以通过联机方式来合并索引叶子页。MINPCTUSED 表示索引叶子页中已用空间量所占的最小百分比。除去某个键后,如果索引页中的已用空间量低于此值,那么数据库管理器会尝试将其余键与相邻页中的键合并。如果有足够的空间,那么执行合并,并删除一个索引叶子页。由于仅当从索引页中除去键时才会以联机方式整理碎片,所以如果键仅仅被标记为“已删除”但并未实际地从页中除去,那么不会以联机方式整理碎片。联机索引整理碎片功能可以改进空间复用情况,但如果 MINPCTUSED 值过大,那么执行合并所需的时间将增加,并且成功进行合并的可能性将降低。建议的 MINPCTUSED 值是 50% 或更小。
CREATE INDEX 语句的 INCLUDE 子句允许对索引叶子页指定除键列以外的一个或多个列。这些“包括列”与索引 B 树的排序操作无关,但可以增加适合于纯索引访问的查询数。但是,它们也会增加索引空间需求,并且,如果所包括的列被频繁更新,那么还可能会增加索引维护成本。更新包括列的维护成本低于更新键列,但高于更新并非作为索引组成部分的列。