2.2 聚集索引表

2.2  聚集索引表


2.2.1  平衡树与索引

  平衡树(Balanced Tree,或者简称 B 树)是为降低查找、顺序读取、插入和删除操作的复杂度而设计的一种平衡查找树。

  平衡树的顶部为根节点(Root Node),底部为叶节点(Leaf Node),中间为非叶节点(Non-Leaf Node)。平衡树中每一个非叶节点会包含一定数据的键值(Key)。这些键值同时也扮演着分割子节点的角色。节点的层数也就是查找某个值所需要的最大查找次数。例如,下图是一棵键值为英语字母的平衡树,共有3层,如果需要查找任意一个字母,最多只需要在树中查找 3 次即可找到该字母。

wKioL1XX9Iih9KsLAACiaDo7uR0469.jpg


  数据库和文件系统普遍使用 B+ 树。这是 B 树的一个变种,在非叶节点中存储的键值同样也会出现在叶节点中,但非叶节点中不存储关联附属数据或指针。在叶节点中的不仅存储键值,还存储关联附属数据或指针。这样,所有的附属数据都保存在了叶节点中,只将键值和子女指针保存在了非叶节点中,因此最大化了非页节点的分支能力。此外,叶节点还增加了一个指向下一个顺序关联叶节点的指针,以改进顺序读取的速度。

wKioL1XYEb_i_XyhAADMF3sef38834.jpg


 

  B+ 树的优势在于:

(1)由于非叶节点不存储键值关联的附属数据,所以非叶节点节省的空间可以存放更多的键值。也就意味着从磁盘存取一页时可获得更多的键值信息。

(2)叶节点形成了一个链,所以对树的全扫描就是对所有叶节点的线性遍历。


  索引是一种存储了 B+ 树结构的数据页。SQL Server 可以利用索引迅速在树结构中导航至条件匹配的数据行,并且提取该数据行。与表扫描相比,通常情况下索引扫描可以减少读取的页的数量,从而获得更佳的性能。



2.2.2  聚集索引

  聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

  下图是聚集索引的示意图。索引的叶级页就是数据页,这是聚集索引在结构上的最大特点。


wKiom1XYEFPw783MAAFcLkdMAio794.jpg


  只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表;如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。因此,SQL Server 的表结构也被称为 HOBT(Heap or Balanced Tree)。一旦创建了聚集索引,在该表的索引中将不再有 ID 为 0 的堆结构。



2.2.3  创建聚集索引表

  在创建聚集索引时必须使用 CLUSTERED 属性。

  下例的语句将为 Orders 表创建一个聚集索引。

CREATE CLUSTERED INDEX IX_Orders_OrderNum

ON Orders (OrderNum)


  对于聚集索引,叶节点就是数据行的物理页,可以通过 DBCC SHOWCONGIT 查看 ID 为 1 的索引。

DBCC SHOWCONTIG (Orders,1)


  显示的结果如下:

DBCC SHOWCONTIG 正在扫描 'Orders' 表...

表: 'Orders' (581577110);索引 ID: 1,数据库 ID: 9

已执行 TABLE 级别的扫描。

- 扫描页数................................: 1644

- 扫描区数..............................: 210

- 区切换次数..............................: 5

- 每个区的平均页数........................: 4.2

- 扫描密度 [最佳计数:实际计数].......: 66.67% [4:6]

- 逻辑扫描碎片 ..................: 20.00%

- 区扫描碎片 ..................: 33.33%

- 每页的平均可用字节数.....................: 125.3

- 平均页密度(满).....................: 98.45%

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


  与堆的扫描结果相比,对索引的扫描多了一个“逻辑扫描碎片”。在扫描索引的叶级页时,如果当前叶级页的“下一页”指针所指向的页不是系统分配给索引的下一个物理页,则计为一次出错页。扫描全部叶级页时返回的出错页的百分比就是“逻辑扫描碎片”。理论上,一个索引的叶级页最好是连续的物理页面,因为这样会产生最佳的性能,也就是说,“逻辑扫描碎片”的值越小越好。

  “区扫描碎片”的计算方法与“逻辑扫描碎片”类似,只不过是以区以单位进行统计。如果当前叶级页的“下一区”位于不连续的包含索引的区,由计为一次出错区。如果索引跨越多个文件,则此数字无意义。


提示:

  如果指定的表或索引已分区,则 DBCC SHOWCONTIG 只显示指定表或索引的第一个分区。



2.2.4  唯一聚集索引

  聚集索引中的数据即可以唯一,也可以不唯一,取决于定义这个索引时的 UNIQUE 设置。

  如果未使用 UNIQUE 属性创建聚集索引,SQL Server 将向表自动添加一个 4 字节 uniqueifier 列,使每个键唯一。此列和列值仅供内部使用,用户不能查看或访问。

  在创建唯一聚集索引时必须使用 UNIQUE CLUSTERED 属性。

CREATE UNIQUE CLUSTERED  INDEX  IX_Customer_CustomerNum  

ON Customers (CustomerNum) 



本文出自 “SQL Server 管理员指南” 博客,谢绝转载!

你可能感兴趣的:(sql,索引)