创建聚集索引

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

可以使用 SQL Server Management Studio 或 Transact-SQL 在表上创建聚集索引。 除了个别表之外,每个表都应该有聚集索引。 聚集索引除了可以提高查询性能之外,还可以按需重新生成或重新组织来控制表碎片。 也可以对视图创建聚集索引。 (聚集索引和非聚集索引文章中定义了聚集索引。)

典型实现

聚集索引按下列方式实现:

  • PRIMARY KEY 和 UNIQUE 约束

    在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 主键列不允许 NULL 值。

    在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。

    将索引创建为约束的一部分后,会自动将索引命名为与约束名称相同的名称。 有关详细信息,请参阅主键和外键约束以及唯一约束和 Check 约束

  • 独立于约束的索引

    指定非聚集主键约束后,您可以对非主键列的列创建聚集索引。

限制

  • 创建聚集索引结构后,旧(源)结构和新(目标)结构的各自的文件和文件组都需要磁盘空间。 在完成事务提交后,才会释放旧结构。 排序也可能需要其他临时磁盘空间。 有关详细信息,请参阅 Disk Space Requirements for Index DDL Operations

  • 如果对具有多个现有非聚集索引的堆创建聚集索引,则必须重新生成所有非聚集索引,以使它们包含聚集键值而非行标识符 (RID)。 同样,如果删除具有多个非聚集索引的表的聚集索引,在 DROP 操作过程中,将重新生成非聚集索引。 对于大型表,该过程可能需要很长时间。

    对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。 在对现有表创建索引时,请考虑将 ONLINE 选项设置为 ON。 如果设置为 ON,则不会持有长期表锁。 这使对基础表的查询或更新可以继续进行。 有关详细信息,请参阅 Perform Index Operations Online

  • 聚集索引的索引键不能包含在 ROW_OVERFLOW_DATA 分配单元中具有现有数据的 varchar 列。 如果对 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. 在“从表格名称中选择列”对话框中,选中要添加到聚集索引的表列的复选框

  6. 选择“确定”

  7. 在“新建索引”对话框中,选择“确定”

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

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

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

  3. 按常规方式创建新表。 有关详细信息,请参阅创建表(数据库引擎)

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

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

  6. 在“索引/键”对话框中,选择“添加”

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

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

  9. 选择关闭

  10. 在“文件”菜单上,选择“保存”以保存 table_name

使用 Transact-SQL

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

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。

    USE AdventureWorks2022;
    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)