聚集索引和非聚集索引的描述

索引是与表或视图关联的磁盘上结构,可加快从表或视图中检索行的速度。 索引包含从表或视图中的一个或多个列生成的键。 这些键存储在结构(B 树)中,使 SQL Server 能够快速高效地查找与键值关联的行或行。

表或视图可以包含以下类型的索引:

  • 集群

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

    • 仅当表包含聚集索引时,表中的数据行才按排序顺序存储。 当表具有聚集索引时,该表称为聚集表。 如果表没有聚集索引,则其数据行存储在名为堆的无序结构中。

  • 非聚集

    • 非聚集索引具有独立于数据行的结构。 非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含键值的数据行的指针。

    • 从非聚集索引中的索引行到数据行的指针称为行定位符。 行定位符的结构取决于数据页是存储在堆还是聚集表中。 对于堆,行定位符是指向该行的指针。 对于聚集表,行定位符是聚集索引键。

    • 可以通过将非键列添加到非聚集索引的叶级来绕过已有索引键的限制,即900字节和16个键列,从而实现完全覆盖的已索引查询。 有关详细信息,请参阅 Create Indexes with Included Columns

聚集索引和非聚集索引都是唯一的。 这意味着没有两行可以具有相同的索引键值。 否则,索引不唯一,多个行可以共享相同的键值。 有关详细信息,请参阅 “创建唯一索引”。

每当修改表或视图的数据时,其索引将被自动维护。

有关其他特殊用途索引类型的索引,请参阅 索引

索引和约束

在表列上定义 PRIMARY KEY 和 UNIQUE 约束时,会自动创建索引。 例如,创建表并标识要作为主键的特定列时,数据库引擎会自动在该列上创建 PRIMARY KEY 约束和索引。 有关详细信息,请参阅 “创建主键 ”和 “创建唯一约束”。

查询优化器如何使用索引

设计良好的索引可以减少磁盘 I/O作,消耗较少的系统资源,从而提高查询性能。 索引对于包含 SELECT、UPDATE、DELETE 或 MERGE 语句的各种查询非常有用。 考虑 AdventureWorks2012 数据库中的查询SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。 执行此查询时,查询优化器会评估用于检索数据的每个可用方法,并选择最有效的方法。 该方法可以是表扫描,也可以扫描一个或多个索引(如果存在)。

执行表扫描时,查询优化器将读取表中的所有行,并提取满足查询条件的行。 表扫描会生成许多磁盘 I/O操作,并且可能占用大量资源。 但是,如果查询的结果集占表中行的很高百分比,那么表扫描可能是最有效的方法。

当查询优化器使用索引时,它会搜索索引键列,查找查询所需的行的存储位置,并从该位置提取匹配的行。 通常,搜索索引的速度比搜索表快得多,因为与表不同,索引通常包含每行很少的列,并且行按排序顺序排列。

执行查询时,查询优化器通常选择最有效的方法。 但是,如果没有索引可用,查询优化器必须使用表扫描。 你的任务是设计和创建最适合你的环境的索引,以便查询优化器可以选择从中选择的有效索引。 SQL Server 提供 数据库引擎优化顾问 ,以帮助分析数据库环境和选择适当的索引。

创建聚集索引

创建非聚集索引