聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。 如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。
聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序。像我们用到的汉语字典,就是一个聚集索引,比如要查“张”,我们自然而然就翻到字典的后面百十页。然后根据字母顺序跟查找出来。这里用到微软的平衡二叉树算法,即首先把书翻到大概二分之一的位置,如果要找的页码比该页的页码小,就把书向前翻到四分之一处,否则,就把书向后翻到四分之三的地方,依此类推,把书页续分成更小的部分,直至正确的页码。
由于聚集索引是给数据排序,不可能有多种排法,所以一个表只能建立一个聚集索引。科学统计建立这样的索引需要至少相当与该表120%的附加空间,用来存放该表的副本和索引中间页,但是他的性能几乎总是比其它索引要快。
由于在聚集索引下,数据在物理上是按序排列在数据页上的,重复值也排在一起,因而包含范围检查(bentween,<,><=,>=)或使用group by 或order by的查询时,一旦找到第一个键值的行,后面都将是连在一起,不必在进一步的搜索,避免啦大范围的扫描,可以大大提高查询速度。
非聚集索引具有独立于数据行的结构。 非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。
从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。 对于堆,行定位器是指向行的指针。 对于聚集表,行定位器是聚集索引键。
sqlserver默认情况下建立的索引是非聚集索引,他不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。他像汉语字典中的根据‘偏旁部首’查找要找的字,即便对数据不排序,然而他拥有的目录更像是目录,对查取数据的效率也是具有的提升空间,而不需要全表扫描。
一个表可以拥有多个非聚集索引,每个非聚集索引根据索引列的不同提供不同的排序顺序。
聚集索引和非聚集索引
动作描述 |
使用聚集索引 |
使用非聚集索引 |
外键列 |
应 |
应 |
主键列 |
应 |
应 |
列经常被分组排序(order by) |
应 |
应 |
返回某范围内的数据 |
应 |
不应 |
小数目的不同值 |
应 |
不应 |
大数目的不同值 |
不应 |
应 |
频繁更新的列 |
不应 |
应 |
频繁修改索引列 |
不应 |
应 |
1.1 查询注意事项具有以下特点的查询使用聚集索引
使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值。
使用 ORDER BY 或 GROUP BY 子句。在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使 数据库引擎 不必对数据进行排序,因为这些行已经排序。 这样可以提高查询性能。
2 列注意事项
2.1定义聚集索引键时使用的列越少越好。 考虑具有下列一个或多个属性的列:
唯一或包含许多不重复的值
按顺序被访问
定义为 IDENTITY。
经常用于对表中检索到的数据进行排序。
频繁更改的列
对大型表创建索引的首选方法是先创建聚集索引
1 典型默认实现
聚集索引按下列方式实现:
在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 主键列不允许空值。
在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。
1 创建聚集索引结构后,旧(源)结构和新(目标)结构的各自的文件和文件组都需要磁盘空间。 在完成事务提交后,才会释放旧结构。 排序也需要其他临时磁盘空间。
2 如果对具有多个现有非聚集索引的堆创建聚集索引,则必须重新生成所有非聚集索引,以使它们包含聚集键值而非行标识符 (RID)。 同样,如果删除具有多个非聚集索引的表的聚集索引,在 DROP 操作过程中,将重新生成非聚集索引。 对于大型表,这可能需要很长时间。
3 对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。 在对现有表创建索引时,请考虑将 ONLINE 选项设置为 ON。 如果设置为 ON,则不会持有长期表锁。
4 聚集索引的索引键不能包含在 ROW_OVERFLOW_DATA 分配单元中具有现有数据的 varcharr 列。 如果对 varchar 列创建了聚集索引,并且 IN_ROW_DATA 分配单元中存在现有数据,则对该列执行的将数据推送到行外的后续插入或更新操作将会失败。
1 SQL Server Management Studio
2 Transact-SQL
CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-20190125-223354] ON [dbo].[A01_SCSDBInfo]
(
[ServerIP] ASC
)
UNIQUE 唯一 CLUSTERED聚集