再读simpledb 之 元数据管理(3)

接着前面的,本节介绍剩下的索引信息管理和视图信息管理。

3、(IndexMgr)索引信息管理

IndexMgr随着系统启动而创建,如果系统已经有idxcat.tbl,说明事先已经创建过索引信息表,直接读取文件内容即可,否则需要创建一个新的索引信息表。表结构如下:

indexName tableName fieldName

新创建索引的时候,需要向idxcat.tbl文件中添加一条记录。

支持返回指定表上创建的所有索引信息,返回的是一个<fieldName,indexINfo>的字典。

IndexInfo维护着某个列上添加的索引的信息,包括:

a. 指定表的指定列中非重复值的数目;

b. 按照某个值在该列上搜索时,访问磁盘块Block个数的估计值;

c. 按照某个值在该列上搜索时,查询得到的记录条数的估计值。

  • 指定表的指定列中非重复值的数目

如果参数中的列名与索引列名相同,则值为1;否则,为统计信息记录的索引列的非重复值和本索引输出记录数的最小值。这里理解上有点问题,稍后在Index中一并解释下。

public int distinctValues(string fname)
{
    if (fldname.Equals(fname))
        return 1;
    else
        return System.Math.Min(si.distinctValues(fldname), recordsOutput());
}
  • 按照某个值在该列上搜索时,访问磁盘块Block个数的估计值

首先计算出每个磁盘块中可容纳的记录条数rpb;

然后用统计信息记录的记录条数除以rpb,得到需要访问的块的数目;

最后用Hash索引来估计下使用索引是需要访问的块的数目。

  • 按照某个值在该列上搜索时,查询得到的记录条数的估计值

用统计信息记录的总记录数除以不重复记录条数,得到每个搜索值可得到的输出记录数

除了上面的信息之外,IndexInfo还提供open()方法,返回一个index对象。该对象默认为HashIndex,不可更改。如果想用BTreeIndex,稍后会详细说明。

Index是一个特殊的表,表模式如下:

blockNumber idNumber dataValue

可以理解为[ RID | dataVal ],其中RID由两部分组成,真实记录在真实数据表中的块号 和 块内的编号。

关于索引的如何使用,稍后会有详细说明。

4、(ViewMgr)视图信息管理

同样视图信息管理随系统启动而创建。视图信息保存在viewcat.tbl表中,表的模式如下:

viewName viewDef

创建视图时,将视图信息按照上面的默写,写入到文件中。

注意,可以看下前面对simpledb支持的SQL的语法,这里的viewDef实际上就是一条SQL语句。

在必要的时候,通过扫面viewcat.tbl文件,根据视图名称,得到视图的定义信息viewDef。

原文地址:https://www.cnblogs.com/YFYkuner/p/2691720.html