钱行慕

导航

【译】聚集索引与非聚集索引描述

原文链接:传送门

一个索引是与表或者视图相关联的硬盘上的结构,其加快了对于表或者视图数据的检索。一个索引包含从表或者视图的一行或者多行建立的键值。这些键值以B-树结构存储,以使得SQL Server快速而高效的找到与键值相关的数据行。

一个表或者视图可以包含如下类型的索引:

  • 聚集索引
    • 聚集索引基于其键值来对表或者视图的数据进行排序及存储。这些键是包含在索引定义中的列。每个表只能由一个聚集索引。这是因为数据行本身只能以一种顺序进行存储。
    • 只有当表包含一个聚集索引时,表中的数据行才会以排序的顺序存储。当表具有一个聚集索引时,这个表便被称为一个聚集表。如果一个表没有聚集索引,它的数据行便会存储为一个无序的结构,称为堆(heap)。
  • 非聚集索引
    • 非聚集索引具有一个和数据行分离的结构。一个非聚集索引包含一个非聚集索引键值,并且每个索引键值条目都包含一个指向数据行的指针,而这个数据行则包含了索引键值。
    • 在非聚集索引的索引行中的指向数据行的指针称为行定位符。行定位符的结构取决于数据页是存储在堆中还是聚集索引中(也就是说,取决于其底层表有没有聚集索引)。对于堆来说,行定位符是一个指向数据行的指针。对于聚集表来说,行定位符是聚集索引键值。
    • 你可以将非键列添加到非聚集索引的叶级,以绕过现有的索引键限制,并执行完全覆盖、索引的查询。

聚集索引和非聚集索引都可以是唯一的。这意味着没有两行数据可以有相同的索引键值。否则的话,索引不是唯一的并且多个数据行可以共享相同的键值。更多信息,请参考Create Unique Indexes

对于一个表或者视图来说,每当表数据有更新的时候,索引都会自动维护。

索引和约束

当主键约束或者唯一性约束被定义在表的列上时,便会自动创建索引。举个例子,当你创建一个具有唯一性索引的表时,数据库引擎会自动创建一个非聚集索引。如果你配置了一个主键,数据库引擎自动创建一个聚集索引,除非表上已经存在一个聚集索引。当你在一个已存在的表上强加一个主键约束并且一个聚集索引已经存在于那个表中,那么SQL Server会强迫主键使用非聚集索引。

更多信息,请参考 Create Primary Keys 和 Create Unique Constraints

查询优化器如何使用索引

设计良好的索引可以减少磁盘IO操作并消费更少的系统资源,因此提高查询性能。对于许多包含SELECT, UPDATE, DELETE, 或者MERGE语句的查询来说,索引都是有用的。考虑AdventureWorks2012数据库中的这个查询,SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。当这个查询执行时,查询优化器评估检索数据的各个可用的方法,并选择最高效的一个方法。这些方法或者是一个表扫描,或者是扫描一个或者多个索引,当然,如果它们存在的话。

当执行一个表扫描的时候,查询优化器读取表中的所有数据行,并提取出满足查询条件的数据行,一个表扫描会产生许多的磁盘I/O操作,并且其是资源密集的。然而,表扫描也可能是最有效率的方法,比如查询的结果集占据了表数据的很高的比例。

当查询优化器使用了一个索引,它会搜索索引键列,找到查询需要的数据行的存储位置,并从此位置提取出匹配的数据行。一般来说,检索索引比检索表会块很多,那是因为不像表,一个索引的每行数据常常包含很少的数据列并且其是按顺序排列的。

 当执行查询时,查询优化器一般都会选择最高效方法。然而,如果没有索引可用,查询 优化器便必须使用一个表扫描。你的任务便是设计和创建最适合你的环境的索引以使得查询优化器有高效的索引以供选择。SQL Server提供了 Database Engine Tuning Advisor 来帮助你分析你的数据库环境,并帮你选择最合适的索引。

相关内容

posted on 2020-11-26 14:55  钱行慕  阅读(119)  评论(0编辑  收藏  举报