暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SQL SERVER聚集索引

w83 2024-06-25
198

1、数据存储在数据页中
表的数据是存储在数据页中(数据页的PageType标记为1),SqlServer一页是8k,存满一页就开辟下一页存储。

如果表有聚集索引,那么一笔一笔物理数据就是按聚集索引字段的大小升/降排序存储在页中。当对聚集索引字段更新或中间插入/删除数据时,都会导致表数据移动(造成性能一定影响),因为它要保持升/降排序。

注意,主键只是默认是聚集索引,它也可以设置为非聚集索引,也可以在非主键字段上设置为聚集索引,全表只能有一个聚集索引。

2、聚集索引字段特性
一个优秀的聚集索引字段一般包含以下4个特性:
(A).自增长
总是在末尾增加记录,减少分页和索引碎片。
(B).不被更改
减少数据移动。
(C).唯一性
唯一性是任何索引最理想的特性,可以明确索引键值在排序中的位置。
(D).字段长度小
聚集索引键长度越小,一页索引页就可以容纳更多索引记录,进而减少索引B树结构的深度。

3、索引“键值”的唯一性
索引键值唯一的话,它在每条记录里才可以正确指向源数据行RID。
如果聚集索引键值不唯一,SqlServer就需要内部生成uniquifier 列组合当作聚集键保证“键值”唯一性;如果非聚集索引键值不唯一,就会增加RID列(聚集索引键或者堆表中的行指针)保证“键值”唯一性。

为了“键值”唯一性,对于聚集索引,uniquifier 列只在索引值重复时增加。
对于非聚集索引,如果创建索引时没定义唯一,RID会在所有记录增加,就算索引值是唯一的;如果创建索引时定义唯一,RID只在叶子层增加,用于查找源数据行,即书签查找操作。

4、字段长度小的优点举例
查询执行的大部分开销是I/O

例如,一个百万记录的表有一个int聚集索引,可能只需要3层的B树结构。
如果把聚集索引定义在更宽的列(比如uniqueidentifier列需要16 字节),那么索引的深度会增加到4层。
任何聚集索引查找需要4个I/O操作(确切的说是4个逻辑读),原先只要3个I/O操作。

同样,非聚集索引里会包含聚集索引键值,聚集索引键长度越小非聚集索引记录也就越小,一页索引页就可以容纳更多索引记录。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论