再读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/archive/2012/09/18/2691720.html
總結
以上是生活随笔為你收集整理的再读simpledb 之 元数据管理(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MP3Player(附源码)
- 下一篇: 深入浅出SQL Server中的死锁