本帖最后由 冰城 于 2013-11-4 11:36 编辑
问题一:
oracle官方文档也说oracle默认的索引为b树索引,但是真正的b树索引要满足一下条件:
1.定义任意非叶子结点最多只有M个儿子;且M>2;
2.根结点的儿子数为[2, M];
3.除根结点以外的非叶子结点的儿子数为[M/2, M];
4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
5.非叶子结点的关键字个数=指向儿子的指针个数-1;
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K < K[i+1];
7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,
其它P指向关键字属于(K[i-1], K)的子树;
8.所有叶子结点位于同一层;
按照这个分析,我觉得oracle默认的索引并不是真正的b树索引,倒像是b*树。请问高手是这样的吗?此问题我很是迷惑我,希望高手或专家能指点迷津。(如下图您觉得像b树所说的吗)
问题二:
不少书上,博客上都说一个索引二元高度为3,那么它要读取4个数据块儿,3个来自索引,1个来自表。如果真是这样,索引的二元高度就等于索引树的高度了,那么想请问下二元高度为0的索引又怎么解释?
(个人理解:如果索引的二元高度为0,那么就是一个节点,也就是叶子节点(也可以说是根节点),当通过索引访问数据表中的某一行时,怎么也得读两个块儿,一个来自索引块儿,一个来自数据表的块儿。所以我认为索引的二元高度并不等于索引的树的本身高度,应该是二元高度+1才等于索引树的高度,不知道这样说有没有问题没,希望高手指点。 |
|