SQL Server 中的索引

2025年3月17日 | 阅读 7 分钟

索引是提高 SQL Server 数据库性能的重要途径之一。它通过提供对数据表中行的轻松访问来**加快查询过程**,类似于书籍的索引可以快速定位书中的信息。如果没有索引,将很难定位特定的数据。我们可以使用 CREATE INDEX、DROP INDEX 和 ALTER INDEX SQL 命令在 SQL Server 中创建新索引、更新现有索引和删除索引。本文将概述 SQL Server 索引,包括它们在数据库中的描述方式以及它们如何加快查询速度。

索引是由表或视图中的单个或多个列组成的键集。它们存储在一个结构(B 树)中,可帮助 SQL Server 用户快速高效地找到与键值关联的行或行。

SQL Server 索引类型

SQL Server 中主要有两种类型的索引

聚簇索引

聚簇索引**使用键值对表或视图中的数据行进行排序和存储**。它们包含在索引定义中。它总是将索引值存储在**B 树结构**中,其中实际数据存储在叶节点中。由于数据行按一个方向存储,因此每个表只能有一个聚簇索引。

只有当表具有聚簇索引时,表才以排序顺序存储行。我们可以将具有聚簇索引的表称为聚簇表。如果表没有聚簇索引,则其行存储在**堆**中,这是一种**无序结构**。

聚簇索引的主要优点是数据在存储系统中按聚簇键值物理排序,并且搜索一系列值会很快。它的主要缺点是“最后一页插入锁争用”,它只在聚簇索引的末尾插入数据。

非聚簇索引

非聚簇索引的结构与聚簇索引相似,只是**实际数据不包含在叶节点中**。非聚簇索引具有非聚簇索引键值,并且每个键值条目都包含对实际数据的引用。根据表数据的存储方式,它可能指向聚簇索引中的数据值或堆结构。如果行定位器是指向行的指针,则它是堆结构。如果行定位器是聚簇索引键,则它是聚簇表。

非聚簇索引的主要优点是**加快查询性能**。它的主要缺点是 DML 操作期间维护索引所需的额外开销。

在 SQL Server 中创建索引

我们可以使用以下语法在 SQL Server 中创建索引

如果要创建**多个索引列**,请使用以下语法

其中,**index_name** 是索引的名称,**table_name** 表示创建索引的表的名称,**column_name** 是应用索引的列的名称。

注意:唯一索引维护表中存在的数据完整性,并通过阻止将多个值输入表中来提高性能。

何时应创建索引?

在以下情况下可以创建索引

  • 当列具有大范围的值时
  • 当列没有大量空值时
  • 当单个或多个列一起用于 WHERE 或 JOIN 子句时

何时应避免索引?

在以下情况下可以避免索引

  • 当表很小时
  • 当列不作为查询条件使用时
  • 当列持续更新时

示例

让我们通过一个示例来了解 SQL Server 中索引的使用。以下语句在数据库 "javatpoint" 中创建一个名为 STUDENT 的表,如下所示

接下来,我们需要使用以下语句插入一些记录

我们可以使用 SELECT 语句验证表数据

我们将看到以下输出

Index in SQL Server

如果我们要获取**年龄大于 20 岁的学生记录**,请执行以下语句

我们将得到以下输出。

Index in SQL Server

这里,查询扫描整个表,只返回年龄大于 20 岁的四行。这个过程将花费很长时间来检索数据,从而导致性能缓慢。我们可以通过使用索引的概念来克服这个缺点。

现在,让我们使用以下语句为 age 列创建一个索引

执行上述语句后,索引创建成功。如果我们再次运行以下语句,则查询不会扫描整个表。因此,索引可以提高查询性能。

如何重命名索引?

有时我们的索引名称没有意义,因此需要更改现有数据库中任何用户创建的对象(包括表、索引和列)的名称或重命名。MS SQL Server 可以**通过两种主要方式重命名或更改索引名称**

  • 使用系统存储过程 sp_rename
  • 使用 SQL Server Management Studio

如果使用系统存储过程重命名索引,我们可以使用以下语法

我们还可以使用**显式参数**来重命名索引

更改索引名称的第二种方法是使用 SSMS。我们可以按照以下步骤操作

  1. 转到数据库 -> 表名 -> 索引。
  2. 右键单击要更改名称的索引,然后从上下文菜单中选择重命名。

下图更清楚地解释了它

Index in SQL Server

更改索引名称的另一种方法是单击**索引**菜单下的索引名称,键入新名称,然后按**Enter**。请看下图

Index in SQL Server

删除索引

我们可以使用 **DROP INDEX 命令**从当前数据库中删除单个或多个索引。

如果我们要同时从一个或多个表中删除多个索引,我们需要使用以下语句定义一个**逗号分隔的索引名称列表**以及相应的表名

我们必须确保拥有 DROP ANY INDEX 权限,或者必须是当前数据库中索引的所有者。

禁用索引

我们可以使用 **ALTER INDEX** 语句禁用 SQL Server 中的索引,如下所示

如果我们要禁用当前数据库中表的所有索引,我们可以使用以下形式的 ALTER INDEX 语句

启用索引

如果我们要启用 SQL Server 中禁用的索引,我们需要重建它,因为我们不能简单地启用它。我们可以使用 **ALTER INDEX** 语句或 **DBCC DBREINDEX** 命令在 SQL Server 中重建索引。

我们可以**启用或重建**表上的索引,如下所示

如果我们要使用 DBCC DBREINDEX 语句启用或重建表上的索引,将使用以下查询

确认索引

我们可以验证用户或服务器提供的特定表中存在的不同索引及其唯一性,如下所示

此语句将显示服务器的所有索引,我们也可以在其中找到自己的表。

过滤索引

当我们的应用程序只需要查询表的一部分行时,过滤索引的概念就发挥作用了。过滤索引是一个带有谓词的非聚簇索引,它允许我们选择要包含在索引中的行。我们可以使用以下**语法创建过滤索引**

过滤索引的主要优点是

  • 过滤索引可以节省空间,尤其是在索引键列稀疏时。具有大量 NULL 值的列被认为是稀疏的。
  • 它还降低了维护成本,因为当相关表中的数据发生更改时,只会更改一部分数据行,而不是所有数据行。

下一主题SQL Server 行号