增量列是否使列上的b-tree索引不平衡?

Bre*_*ren 4 database oracle indexing performance b-tree

我一直在考虑两个问题.无法在互联网上找到任何关于此的资源.dbms如何处理它?或者他们呢?尤其是Oracle.

在提出问题之前,这里有一个例子:假设我有一个主表"MASTER"和从表"SLAVE".主表有一个"ID"列,它是主键,索引由Oracle创建.Slave表具有引用主表和"SLAVE_NO"的外键"MASTER_ID".这两个一起是slave表的主键,它再次被索引.

 **MASTER**  |  **SLAVE**
     (P) ID <------> (P)(F) MASTER_ID 
                     (P) SLAVE_NO
Run Code Online (Sandbox Code Playgroud)

现在的问题;

1-如果MASTER_ID是一个自动增量列,并且没有删除任何记录,这是否会使表的索引不平衡?Oracle是否会定期重建索引?据我所知,Oracle仅在构建时平衡索引分支.Oracle是否会自动重建索引?如果水平上升到某个高水平?

2-假设Oracle不会自动重建,除了安排定期重建索引的作业之外,订购SLAVE表的主键列是否更明智?我的意思是代替"MASTER_ID","SLAVE_NO"将其命名为"SLAVE_NO","MASTER_ID"i,它会帮助奴隶表的b树索引更加平衡吗?(那么每个主表可能没有确切数量的从属记录,但仍然看起来好于逆序)

有人知道这件事吗?还是意见?

Qua*_*noi 7

如果MASTER_ID是自动增量列,并且没有删除任何记录,这是否会使表的索引不平衡?

Oracle的索引永远不会"不平衡":索引中的每个叶子与任何其他叶子的深度相同.

没有页面拆分本身会引入一个新级别:叶子页面不会成为新页面的父级,就像在非自平衡树上一样.

相反,会生成拆分页面的兄弟,新记录(可能还有旧页面中的一些记录)会转到新页面.指向新页面的指针将添加到父页面.

如果父页面也是空间不足(无法接受指向新创建的叶页的指针),它也会被拆分,依此类推.

这些拆分可以传播到根页面,根页面的分割是增加索引深度的唯一因素(并且一次性对所有页面执行此操作).

索引页面另外被组织成双链表,每个列表都在其自己的级别上.如果树不平衡,这将是不可能的.

如果master_id是自动递增,则意味着所有拆分发生在末尾(例如称为90/10拆分),这使得最密集的索引成为可能.

订购SLAVE表的主键列是否更明智?

不,由于上述原因,它不会.

如果你加入slavemaster时候,你可以考虑设立CLUSTER两个表,通过索引的master_id.这意味着来自两个表的共享相同的记录将master_id转到相同或附近的数据页面,这使得它们之间的连接非常快.

当引擎从master索引或其他任何地方找到记录时,这也意味着它已经找到了slave与之相关的记录master.反之亦然,定位slave也意味着定位它master.