SQL SERVER 聚集索引与非聚集索引

  理解索引

快速开发平台

索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

聚集索引结构

--建立UserAddDate聚集索引
CREATE CLUSTERED INDEX [IX_AddDate] ON [User]
(
 [AddDate] ASC
)

聚集索引特点:

1)聚集索引的叶节点就是实际的数据页
2)聚集索引中的排序顺序仅仅表示数据页链在逻辑上是有序的。而不是按照顺序物理的存储在磁盘上
3)行的物理位置和行在索引中的位置是相同的
4)每个表只能有一个聚集索引
5)聚集索引的平均大小大约为表大小的5%左右

非聚集索引结构

--建立UserAddDate非聚集索引
CREATE NONCLUSTERED INDEX [IX_AddDate] ON [User]
(
 [AddDate] ASC
)

非聚集索引特点:

非聚集索引的页,不是数据,而是指向数据页的页。
若未指定索引类型,则默认为非聚集索引。
叶节点页的次序和表的物理存储次序不同
每个表最多可以有249个非聚集索引
在非聚集索引创建之前创建聚集索引(否则会引发索引重建)

使用索引的缺点:

索引需要占用数据表以外的物理存储空间
创建索引和维护索引要花费一定的时间
当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。

选择建立哪种索引

何时创建聚集索引更提高性能

Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:

独特, 狭窄, 持续增长的,最好是只向上增加。

例如:

Identity
Date, identity
GUID (only when using newsequentialid() function)

非聚集索引提高性能的方法

非聚集索引由于B树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快。但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID(heap结构中的行标识符)中去寻找数据了,这时候就可以很大的提高性能,这就是覆盖面(Covering) 的问题。

由于聚集索引叶子节点就是具体数据,所以聚集索引的覆盖率是100%, 通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。

当查询中所有的columns都包括在index上时,我们说这 index covers the query. Columns的顺序在此不重要(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。

在 SQL Server 2005 中,为了提高这种 Covering 带来的好处,甚至可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。

补充:只有查询在具有高度选择性的情况下,非聚集索引才有优势。

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自:快速开发框架 » SQL SERVER 聚集索引与非聚集索引
本文标题:SQL SERVER 聚集索引与非聚集索引

原文地址:https://www.cnblogs.com/frfwef/p/14572472.html