SQL Server 中的聚集索引

SQL Server 中的聚集索引定义了表中数据的物理存储顺序。这意味着聚集索引会先对记录进行排序,然后再存储它们。

通常,在创建主键时,SQL Server 会自动由该主键创建聚集索引。但是,您也可以使用 CREATE CLUSTER INDEX 语句显式创建它。让我们看看如何使用 Transact Query 和 Management Studio 创建和删除聚集索引。

在 SQL Server 中创建聚集索引

当您在列上创建主键约束时,它将自动为您在该列上创建聚集索引。仅当表中没有现有聚集索引时才会发生这种情况。请记住,每个表只能创建一个聚集索引。

在此示例中,我们将向您展示如何使用 SQL Server Transact 语句创建聚集索引。在这里,我们将在创建表时创建主键。请参考创建表文章。

 CREATE TABLE [CustomerRecord]
(
  [CustomerKey] [int] NOT NULL PRIMARY KEY,
  [FirstName] [varchar](50) NOT NULL ,
  [LastName] [varchar](50) NULL,
  [EmailAddress] [nvarchar](50) NULL,
  [Profession] [nvarchar](100) NULL,
  [Yearly Income] [money] NULL
)
Messages
--------
Command(s) completed successfully.

我将使用 sp_helpindex 存储过程来检查 CustomerRecord 表上的情况。

EXECUTE SP_HELPINDEX CustomerRecord

如您所见,SQL Server 主键已在 Customer Key 列上创建了聚集索引和唯一索引。

您还可以使用 SP_HELP 存储过程来检查相同的信息。

EXECUTE SP_HELP CustomerRecord

它将显示有关表的所有信息。

SQL Server Clustered Indexes 3

或者,您可以展开创建它的表,然后展开“索引”文件夹。

向 SQL Server 聚集索引列插入行

我将插入几行来检查聚集索引的功能。如您所见,我们将五条记录插入表中,但 Customer Key 的值并非按正确顺序排列。

INSERT INTO [dbo].[CustomerRecord] 
VALUES (4, 'Imran', 'Khan', 'abc@abc.com', 'Skilled Professional', 15900)
      ,(2, 'Doe', 'Lara', 'xyz@abc.com', 'Management', 15000)
      ,(5, 'Ramesh', 'Kumar', 'mnop@abc.com', 'Professional', 65000)
      ,(1, 'SQL', 'Tutorial', 'sqltut@abc.com', 'CEO', 654500)
      ,(3, 'Tutorial', 'Gateway', 'tgate@abc.com', 'HR', 95000)
Messages
--------
(5 row(s) affected)

我将选择我们之前插入的记录。从下面的图片中可以看到,记录已按 Customer Key 以升序排序,因为聚集索引会重新排序(重新排列)记录。

删除或废弃 SQL Server 中的聚集索引

请使用 DROP INDEX 语句来删除或废弃。

DROP INDEX CustomerRecord.PK__Customer__95011E647C9C5969

这里,主键会自动创建我们的聚集索引,因此我们无法使用此语句直接删除它。但对于仅显式创建一个,此方法将起作用。

Delete or Drop Clustered Indexes error 7

删除聚集索引 Management Studio

在对象资源管理器中,展开“数据库”文件夹,然后选择已存在聚集索引的表。接下来,展开“索引”文件夹,右键单击键名,然后选择“删除”选项。

Delete a Clustered index 8

选择“删除”选项后,将打开“删除对象”窗口。单击“确定”以删除它。

在现有表上创建 SQL Server 聚集索引

在本例中,我们将向您展示如何向现有表添加聚集索引。语法是

CREATE CLUSTERED INDEX Index_Name
ON Table_Name (Column_Name(s) ASC/DESC)

这将创建 Customerrecord 表中存在的 Yearly Income 列

CREATE CLUSTERED INDEX IX_CustomerRecord_YearlyIncome
ON CustomerRecord ([Yearly Income] ASC)

现在您可以看到 Yearly Income 列按升序对数据进行排序

这次我们是显式创建的。所以,我将尝试使用 DROP INDEX 语句删除该键。

DROP INDEX CustomerRecord.IX_CustomerRecord_YearlyIncome

我们使用 Drop Index 语句成功删除了聚集索引。

Messages
--------
Command(s) completed successfully.

在 SQL Server 中创建复合聚集索引

它允许您在多个列上创建聚集索引,但不能创建多个聚集索引。因此,您可以将同一个聚集索引指向多个列。为了演示复合聚集索引,我们在 Customer record 表中添加了另外两条记录。

Create Composite Clustered Index 12

在此示例中,我们在 Professional 和 Yearly Income 列上添加了聚集索引。

CREATE CLUSTERED INDEX IX_CustomerRecord_YearlyIncome
ON CustomerRecord ([Profession] ASC, [Yearly Income] DESC)
Messages
--------
Command(s) completed successfully.

现在您可以看到数据按 Professional 列的升序排序,然后按 Yearly Income 列的降序排序。

使用 Management Studio

本节介绍使用 Management Studio 创建聚集索引。在此SQL示例中,我们向您展示如何使用Management Studio创建它。为此,请转到对象资源管理器,然后展开包含表的“数据库”文件夹。

请展开要创建聚集索引的表,然后右键单击“索引”文件夹以打开上下文菜单。请选择“新建”,然后选择“聚集...”选项。

create Clustered Index using Management Studio 15

选择选项后,将打开一个新窗口。请更改聚集索引的名称。

单击“添加”按钮,然后选择要在其上指定索引的列名。目前,我们选择 Yearly Income 列。

请更改排序顺序

现在您可以看到表按 Yearly Income 列的降序排序。

使用表设计器

请在 SQL Server 对象资源管理器中展开要创建聚集索引的表。接下来,右键单击它,然后选择“设计”选项以在设计器窗口中打开表。接下来,右键单击列,然后选择“设置索引/键…”选项。

Create a Clustered index using Table Designer

请单击“添加”按钮以添加一个新的。选择“添加”选项后,SSMS 将为您创建它。

接下来,单击“列”选项旁边的“浏览”按钮以更改列。接下来,我们选择 Profession 作为列名,并选择 Descending 作为排序顺序。

在“表设计器”下,请将“创建为聚集”选项从默认的“否”更改为“是”。

Create a Clustered Index 23

就是这样!我们创建了一个聚集索引。现在您可以看到数据按 Income 列的降序排序。