创建聚集索引

可以使用 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_ddladmindb_owner 固定数据库角色的成员。

使用 SQL Server Management Studio

使用对象资源管理器创建聚集索引

  1. 在对象资源管理器中,展开要在其中创建聚集索引的表。

  2. 右键单击 “索引 ”文件夹,指向 “新建索引”,然后选择“ 聚集索引...”

  3. 在“ 新建索引 ”对话框中的“ 常规 ”页上,在 “索引名称 ”框中输入新索引的名称。

  4. “索引键列”下,单击“ 添加...”

  5. 在“table_name中选择列”对话框中,选中要添加到聚集索引的表列的复选框。

  6. 单击 “确定”

  7. 在“ 新建索引 ”对话框中,单击“ 确定”。

使用表设计器创建聚集索引

  1. 在对象资源管理器中,展开您想要用聚集索引创建表的数据库。

  2. 右键单击 “表” 文件夹,然后单击“ 新建表...”

  3. 像平常一样创建新表。 有关详细信息,请参阅“创建表”(数据库引擎)。

  4. 右键单击上面创建的新表,然后单击“ 设计”。

  5. 在“表设计器”菜单上,单击“索引/键”

  6. 在“ 索引/键 ”对话框中,单击“ 添加”。

  7. “所选主键/唯一键”或“索引 ”文本框中选择新索引。

  8. 在网格中,选择“ 创建为聚集”,然后从属性右侧的下拉列表中选择 “是 ”。

  9. 单击 “关闭”

  10. 在“ 文件 ”菜单上,单击“ 保存table_name

使用 Transact-SQL

创建聚集索引

  1. “对象资源管理器” 中,连接到某个数据库引擎实例。

  2. 在标准栏上,单击“新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击 执行

    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)。

另请参阅

创建主键
创建唯一约束