我一直在思考两个问题。 这个在互联网上找不到任何资源。 如何DBMS处理呢? 还是他们? 尤其是甲骨文。
该问题之前,这里有一个例子:说我有一个主表“MASTER”和从表“SLAVE”。 主表具有“ID”栏,其是主键和由Oracle.Slave表创建的索引具有外键“MASTER_ID”,其指主表和“SLAVE_NO”。 这两个一起是从属表,它被再次建立索引的主键。
**MASTER** | **SLAVE**
(P) ID <------> (P)(F) MASTER_ID
(P) SLAVE_NO
现在的问题;
1-如果MASTER_ID被包含自动增量列,并没有记录被彻底删除,不这样得到表的索引不平衡? Oracle是否周期性重建索引? 据我所知只有甲骨文在构建时平衡指数分支机构。 Oracle是否重新建立索引自动过的? 说,如果水平上升到一定高度?
2-假设Oracle没有从调度作业,其周期性地重建索引,这将是明智订购从属表的主键列扭转自动重建,除了? 我的意思不是“MASTER_ID”,“SLAVE_NO”排序为“SLAVE_NO”,“MASTER_ID”我,这将有助于从表中的B树索引更平衡? (当然每个主表可能不会有从属记录确切的数字,但仍比相反的顺序似乎更)
任何人都知道呢? 或意见?
如果MASTER_ID
被包含自动增量列,并没有记录被彻底删除,不这样得到表的索引不平衡?
Oracle
的指标是从来没有‘不平衡’:在指数每一片叶子都在同一深度任何其他叶。
没有页面拆分本身引入了一个新的水平:叶子页不会成为新页面的父母一样,那将是一个非自我平衡的树。
相反,拆分页面兄弟姐妹提出,而新的记录(再加上可能还有一些从旧页的记录)进入新的页面。 一个指向新的页面添加到父。
如果父页面了太多的空间(无法接受指针到新创建的叶页),它被分割为好,等等。
这些裂缝可以传播到根页面,其拆分为这增加了指数的深度(和做它的所有页面一次)的唯一的事情。
索引页还组织到双链表,对自己的水平每个列表。 如果树是不平衡的,这将是不可能的。
如果master_id
自动递增,这意味着所有的分裂发生在末端(例如称为90/10
这使得最密集索引可能分割)。
难道是明智的订购SLAVE
表的主键列扭转?
不,它不会对上面的原因。
如果你加入slave
到master
的时候,你可能会考虑创建一个CLUSTER
两个表,通过索引master_id
。 这意味着,从两个表,共享相同的记录master_id
,去同一个或附近的数据页,这使得它们之间的连接速度非常快。
当发动机从发现记录master
,与指数或什么的,这也意味着它已经发现,从记录slave
与该被连接master
。 反之亦然,定位一个slave
也意味着定位其master
。
在B树索引MASTER_ID
将继续为“平衡”最有用的定义均衡。 特别地,根块和所有子块之间的距离将始终是相同的,并且在任何分支的数据量将是至少大致euqal到的数据量在任何其它同级分支。
作为将数据插入到一个上产生的序列列的索引,Oracle会在叶片上进行90-10块分割时的数据的任何特定水平的量增加。 如果,例如,你有一个叶块,可容纳10行,当它是满的,你要添加的11行,Oracle会创建一个新的块,叶子在第一块中的前9项,放入2项新块,并更新与新块的地址父块。 如果父块需要拆分,因为它持有地址对于很多孩子,一个类似的过程发生。 这使得在其整个生命相对平衡的指标。 理查德·富特(在Oracle索引专家)对一个优秀的博客当Oracle索引并高度增加是进入有关如何工作的更多的细节。
你可能担心的指数变得歪斜的唯一情况是,当你经常从索引的左侧删除大多数但不是所有的块。 如果,例如,您决定删除90%,从指数留下一排指向数据每一片叶子节点的左侧的数据,索引可以在这个意义上变得不平衡,一些路径导致极大地更多数据比其他路径。 Oracle不回收索引的叶节点,直到他们完全空的,所以你可以使用更多的空间比实际需要与索引的左侧结束。 这并没有真正影响系统much--它更是一个空间利用率的性能issue--但它可以通过让你不合并索引你清除数据后(或构建您的清洗修复t让许多稀疏块)。