可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中的表上创建聚集索引。 除了极少数例外,每个表都应具有聚集索引。 除了提高查询性能外,还可以按需重新生成或重新组织聚集索引以控制表碎片。 还可以在视图上创建聚集索引。 (聚集索引在聚集和非聚集索引描述主题中定义。)
本主题内容
准备工作:
若要在表上创建聚集索引,请使用:
在您开始之前
典型实现
群集索引采用以下方式实现:
PRIMARY KEY 和 UNIQUE 约束
创建 PRIMARY KEY 约束时,如果表中的聚集索引尚不存在且未指定唯一的非聚集索引,则会自动创建列或列的唯一聚集索引。 主键列不能允许 NULL 值。
创建 UNIQUE 约束时,会创建唯一的非聚集索引,以默认强制实施 UNIQUE 约束。 如果表上的聚集索引尚不存在,则可以指定唯一聚集索引。
作为约束的一部分创建的索引会自动指定与约束名称相同的名称。 有关详细信息,请参阅 主键和外键约束 以及 唯一约束和 Check 约束。
独立于约束的索引
如果指定了非聚集主键约束,则可以在主键列以外的列上创建聚集索引。
局限性与限制
创建聚集索引结构时,需要其各自的文件和文件组中的旧(源)和新的(目标)结构的磁盘空间。 在完成事务提交之前,不会解除分配旧结构。 可能还需要额外的临时磁盘空间进行排序。 有关详细信息,请参阅 索引 DDL 操作的磁盘空间要求。
如果在具有多个现有非聚集索引的堆上创建聚集索引,则必须重新生成所有非聚集索引,以便它们包含聚集键值而不是行标识符(RID)。 同样,如果在具有多个非聚集索引的表上删除聚集索引,则非聚集索引将作为DROP操作的一部分重新构建。 这可能在大型数据表上花费大量时间。
在大型表上生成索引的首选方法是从聚集索引开始,然后生成任何非聚集索引。 在现有表上创建索引时,请考虑将 ONLINE 选项设置为 ON。 设置为 ON 时,不再保留长期表锁。 这样,基础表的查询或更新就可以继续。 有关详细信息,请参阅 Perform Index Operations Online。
聚集索引的索引键不能包含
varchar具有ROW_OVERFLOW_DATA分配单元中现有数据的列。 如果在列上varchar创建了聚集索引,并且现有数据位于IN_ROW_DATA分配单元中,则对推送数据行外列的后续插入或更新作将失败。 若要获取有关可能包含行溢出数据的表的信息,请使用 sys.dm_db_index_physical_stats(Transact-SQL) 动态管理功能。
安全
权限
需要对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员或 db_ddladmin 和 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio
使用对象资源管理器创建聚集索引
在对象资源管理器中,展开要在其中创建聚集索引的表。
右键单击 “索引 ”文件夹,指向 “新建索引”,然后选择“ 聚集索引...”。
在“ 新建索引 ”对话框中的“ 常规 ”页上,在 “索引名称 ”框中输入新索引的名称。
在 “索引键列”下,单击“ 添加...”。
在“从table_name中选择列”对话框中,选中要添加到聚集索引的表列的复选框。
单击 “确定” 。
在“ 新建索引 ”对话框中,单击“ 确定”。
使用表设计器创建聚集索引
在对象资源管理器中,展开您想要用聚集索引创建表的数据库。
右键单击 “表” 文件夹,然后单击“ 新建表...”。
像平常一样创建新表。 有关详细信息,请参阅“创建表”(数据库引擎)。
右键单击上面创建的新表,然后单击“ 设计”。
在“表设计器”菜单上,单击“索引/键”。
在“ 索引/键 ”对话框中,单击“ 添加”。
在 “所选主键/唯一键”或“索引 ”文本框中选择新索引。
在网格中,选择“ 创建为聚集”,然后从属性右侧的下拉列表中选择 “是 ”。
单击 “关闭” 。
在“ 文件 ”菜单上,单击“ 保存table_name。
使用 Transact-SQL
创建聚集索引
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。
USE AdventureWorks2012; GO -- Create a new table with three columns. CREATE TABLE dbo.TestTable (TestCol1 int NOT NULL, TestCol2 nchar(10) NULL, TestCol3 nvarchar(50) NULL); GO -- Create a clustered index called IX_TestTable_TestCol1 -- on the dbo.TestTable table using the TestCol1 column. CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1); GO
有关详细信息,请参阅 CREATE INDEX(Transact-SQL)。