结构推理 假设外存的页块大小为4000字节(实际也许是4096字节,为了计算的方便,就取成4000字节),指向外存的地址指针需要5字节。现在有一个由20×106条记录构成的文件,每条记录为200字节,其中包括关键码5字节。
   问:如果采用B树结构的索引文件存储,应该设计为多少阶的B树?索引部分需要占用多少外存的页块?如果所有记录已经按照关键码排序,每条记录的检索概率相同。找到一个需要的记录平均需要访问多少次外存?
【正确答案】(1)计算B树的阶数。
   根据B树的概念,B树的一个结点最大不应该超过外存的一个页块。假设B树为m阶,一个B树的结点中最多存放m-1个关键码和对应的记录地址,另外还包括m个子树的根结点的位置。根据假设,每个关键码和指针的长度都为5个字节,所以:
   (2×(m-1)+m)×5≤4000
   计算结果为B树的阶数最大为266。
   (2)计算B树的高度(假设用B树建立的是稀疏索引——也就是说,每个索引相对应顺序文件中的一个页块)。
   现有20×106条记录,每条记录为200字节,共占用空间4000×106字节;又根据题目假设,每个员块大小为4000字节,所以需要分在106个页块中,用266阶B树建立索引,各层的关键码分布为:
   0层的关键码最多为n0=265;
   1层的关键码最多为n1=266×265=70490;
   2层的关键码最多为n2=2662×265=1.8750340×107
   3层的关键码最多为n3=2663×265=4.987590440×109
   因为n0+n1<106<n0+n1+n2,所以B树的高度至少为2。
   0层的关键码最少为n0=132;
   1层的关键码最少为n1=133×132=17556;
   2层的关键码最少为n2=1332×132=2.334948×106;
   3层的关键码最少为n3=1333×132=3.10548084×108
   因为n0+n1<106<n0+n1+n2,所以B树的高度至多为2。
   结论为:B树的高度为2。
   (3)B树索引部分的空间开销。
   每个页块最少存放132个关键码,所以最多需要106/132=7576个页块。
   每块最多存放265个关键码,所以最少需要106/265=3774个页块。
   (4)查询记录需要的访问次数。
   首先在B树中检索:最快访问1次外存就能够确定记录的地址,最慢需要访问3次外存才能确定记录的地址。如果需要取出被查询的记录,还需要根据查询得到的地址访问1次外存。
【答案解析】