2017-02-22 84 views
3

请帮助我了解什么,我觉得是两个事实之间的矛盾:在B树结构 聚集索引存储行级别中间级密钥的数据在哪里?

  • 只有叶节点包含实际的表数据

    1. SQL Server存储数据,而中间的人只存储密钥和指向儿童的指针

    一般来说,B树具有以下特性:对于中间节点中的给定密钥,左子树中的所有密钥都比它小,右子树也更大,这样:

    Example B-Tree

    在上面的例子中(image credit),显然将一个ID = 7的行插入表中。但是,如果该ID不能位于示例的根节点中并且叶节点中不存在7,那么该ID的行数据(非关键列)在哪里?

    显然,除了“索引是B树”还有更多,我希望有一些见解。

  • +0

    我不知道答案是什么,但感谢张贴一些有趣的东西。也许直接在帖子中引用维基百科页面,用链接而不是仅指出图像源。 – Tanner

    回答

    2

    当建立一个B树索引,它从叶级开始 - 将数据排序并写入数据页并创建一个双链表。

    从每个页面获取最小键值(从第一页开始的NULL),并用于构建下一级索引的索引页,因此索引页中的每一行都包含下面的页的ID和它的最小关键值。它再次执行相同操作,从每个索引页面获取最小键值,以创建下一个级别。

    这样继续下去,直到所有内容都适合于单个页面 - 这是根。

    所有中间级别和根的页面都遵循相同的模式,页面ID和该页面的最小键值。

    在上图中,假设它只是三个叶级页面和根,根应该包含(pageID:1 Key:NULL),(pageID:2 Key:9)(pageID:3 Key:18)

    2

    该图表适用于B树,但从技术上讲,SQL Server使用B +树结构。向下滚动一下Wiki article,你会发现

    在B +树中,密钥的副本存储在内部节点中;密钥和记录存储在树叶中;另外,叶节点可以包括指向下一叶节点的指针以加速顺序访问(Comer 1979,第129页)。

    因此内部节点将仅具有的键的拷贝,并且将在叶片(其中,在一个簇索引的情况下,实际的数据被保持为好)进行复制。

    你可以找到更多的细节here。你会注意到在注释部分,其他一些人注意到SQL Server使用B +树。

    1

    (请原谅我的字绘画技能)

    虽然图像确实代表B树,实际的SQL Server有一个稍微不同的实现,特别是B +树。我会尝试使用的视觉效果,以及解释,考虑下面的图作为一个例子:

    enter image description here

    如该图所示,键不仅在一个节点存在(在这种情况下,根),但是它们被复制并分发到子节点直到叶节点。 (在这种情况下,树只有2级,根级和叶级)。

    因此,当运行键(Adams, Joe)的查询时,按照您在问题中提到的规则(左侧较小的键,右侧较大的键)在B-Tree中查找键。

    这将持续到达到LEAF节点。

    此时有2个优,具体地为SQL Server:

    • 非聚集索引(图中的上面的表示):

      • 包含一个ROW_ID/PAGE_ID柱哪些点到存在该行的数据页面
      • 数据库引擎检索该页面并在其中查找ROW_ID
    • 聚集索引:

      • 包含叶级的整个数据页
      • 数据库并不需要检索的页面,因为它已经在叶级,只是做了查找的关键内页