再读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。