索引文件包含一个头记录以及一个或多个结点记录。头记录包含根结点、当前的文件大小、关键字长度、索引选项与签名以及用可打印的 ASCII 表示的关键字值和 FOR 表达式。头记录从文件位置 0 开始。
其余的结点记录包含属性值,现有的关键字数目以及指向当前结点的左结点和右结点(在同一层次上)的指针。另外还包含有一组字符,其中包括关键字值和指向某个低级结点或实际的表记录编号的指针。输出到文件中的每个记录的大小为 512 字节。
索引头记录
字节偏移 | 说明 |
00 – 03 | 指向根结点的指针 |
04 - 07 | 指向自由结点列表的指针(如果不存在则为 - 1) |
08 - 11 | 指向文件尾的指针(文件大小) |
12 - 13 | 关键字长度 |
14 | 索引选项(下列某一数值或它们的和): 1 – 唯一索引 8 – 索引包含 FOR 子句 |
15 | 索引签名(供将来使用) |
16 - 235 | 关键字表达式(未编译;最多 220 个字符)1,3 |
236 - 455 | FOR 表达式(未编译;以 null 值字节结束,最多220 个字符) |
456 - 511 | 未使用 |
索引结点记录
字节偏移 | 说明 |
00 - 01 | 结点属性(下列某一数值或它们的和): 0 – 索引结点 1 – 根结点 2 – 叶结点 |
02 - 03 | 现有关键字的数目(0,1 或更多) |
04 - 07 | 指向当前结点左结点的指针(在同一层次上;如果不存在,则为 - 1) |
08 - 11 | 指向当前结点右结点的指针(在同一层次上;如果不存在,则为 - 1) |
12 - 511 | 最多有 500 个字符,其中包括关键字长度的值,以及一个四字节的十六进制数表示(按照一般的自左而右的格式存储): 如果结点为叶结点(属性 = 02 或 03),这四个字节包含以十六进制格式表示的实际表记录编号;否则,这四个字节包含内联索引指针2。 字节 02 - 03,指定在这组字符中关键字/四字节十六进制数组合出现的次数。 |
1 关键字类型并不存储在索引中。必须由关键字表达式确定。
2 除了字符串、关键字值和叶结点中四字节数以外的所有数值均以保留码 (Intel 8086 格式) 表示。
3 使用数字作为关键字时要经过特殊处理。将使用下列算法转换数字,使得它们可以按照与字符相同的 ASCII 的排序序列进行排序。
在下面结构中查找关键字时,需要在根结点和叶结点之间的某个路径上搜索。在最低层上的结点是叶结点。因为关键字已进行了排序,因而子树中的所有关键字均小于或等于父结点的关键字。
上图中,使用字母作为关键字值。另外,每个关键字之后还有一个四字节的十六进制数。与叶结点中关键字相关联的数是实际的表编号—其他结点中的关键字都有与之关联的内联索引指针。
索引结点记录的 12—511 字节可分解如下:
在 12—511 字节中,关键字值/十六进制数组合共出现 n 次, n 为现有关键字的数目。