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 聚集索引列插入行
我将插入几行来检查聚集索引的功能。如您所见,我们将五条记录插入表中,但 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
这里,主键会自动创建我们的聚集索引,因此我们无法使用此语句直接删除它。但对于仅显式创建一个,此方法将起作用。

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

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

在现有表上创建 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 表中添加了另外两条记录。

在此示例中,我们在 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创建它。为此,请转到对象资源管理器,然后展开包含表的“数据库”文件夹。
请展开要创建聚集索引的表,然后右键单击“索引”文件夹以打开上下文菜单。请选择“新建”,然后选择“聚集...”选项。

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

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

请更改排序顺序

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

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

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

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

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

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