代码改变世界

索引 - 索引基础知识

2013-02-18 16:54  BIWORK  阅读(458)  评论(0编辑  收藏  举报

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

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

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

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

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

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

    • 您可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900 字节和 16 键列), 并执行完整范围内的索引查询. 有关详细信息,请参阅 具有包含列的索引

有关索引结构的详细信息, 请参阅表和索引数据结构体系结构 

聚集索引和非聚集索引都可以是唯一的, 这意味着任何两行都不能有相同的索引键值. 另外,索引也可以不是唯一的, 即多行可以共享同一键值. 有关详细信息, 请参阅 唯一索引设计指南 

每当修改了表数据后, 都会自动维护表或视图的索引.


索引和约束

对表列定义了 PRIMARY KEY 约束和 UNIQUE 约束时, 会自动创建索引. 例如, 如果创建了表并将一个特定列标识为主键, 则 数据库引擎自动对该列创建 PRIMARY KEY 约束和索引. 有关详细信息, 请参阅 创建索引(数据库引擎)


查询优化器如何使用索引

设计良好的索引可以减少磁盘 I/O 操作, 并且消耗的系统资源也较少, 从而可以提高查询性能. 对于包含 SELECT,UPDATE,DELETE 或 MERGE 语句的各种查询,索引会很有用.

例如, 在 AdventureWorks2008R2 数据库中执行的查询 

SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250.

执行此查询时, 查询优化器评估可用于检索数据的每个方法, 然后选择最有效的方法. 可能采用的方法包括扫描表和扫描一个或多个索引(如果有).

扫描表时, 查询优化器读取表中的所有行, 并提取满足查询条件的行. 扫描表会有许多磁盘 I/O 操作, 并占用大量资源. 但是, 如果查询的结果集是占表中较高百分比的行, 扫描表会是最为有效的方法. 

查询优化器使用索引时, 搜索索引键列, 查找到查询所需行的存储位置, 然后从该位置提取匹配行. 通常, 搜索索引比搜索表要快很多, 因为索引与表不同, 一般每行包含的列非常少, 且行遵循排序顺序. 

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


下表列出了 SQL Server 中可用的索引类型,并提供了指向其他信息的链接。

索引类型

说明

其他信息

聚集

聚集索引基于聚集索引键按顺序排序和存储表或视图中的数据行,聚集索引按 B 树索引结构实现,B 树索引结构支持基于聚集索引键值对行进行快速检索.

聚集索引设计指南

聚集索引结构

非聚集

既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引. 非聚集索引中的每个索引行都包含非聚集键值和行定位符, 此定位符指向聚集索引或堆中包含该键值的数据行. 索引中的行按索引键值的顺序存储,但是不保证数据行按任何特定顺序存储,除非对表创建聚集索引.

非聚集索引设计指南

非聚集索引结构

唯一

唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的.

唯一索引设计指南

聚集索引和非聚集索引都可以是唯一索引.

包含列索引

一种非聚集索引,它扩展后不仅包含键列,还包含非键列。

具有包含列的索引

全文

一种特殊类型的基于标记的功能性索引,由 Microsoft SQL Server 全文引擎生成和维护,用于帮助在字符串数据中搜索复杂的词.

全文索引填充

空间

利用空间索引,可以更高效地对 geometry 数据类型的列中的空间对象(空间数据)执行某些操作,空间索引可减少需要应用开销相对较大的空间操作的对象数.

空间索引概述

筛选

一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询,筛选索引使用筛选谓词对表中的部分行进行索引.与全表索引相比,设计良好的筛选索引可以提高查询性能,减少索引维护开销并可降低索引存储开销.

筛选索引设计准则

XML

xml 数据类型列中 XML 二进制大型对象 (BLOB) 的已拆分持久表示形式.

XML 数据类型列的索引