创建非聚集索引

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

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中创建非聚集索引。 非聚集索引是一种与存储在表中的数据相分离的索引结构,可对一个或多个选定列重新排序。 非聚集索引通常可帮助你通过比搜索基础表更快的速度查找数据;有时可以完全由非聚集索引中的数据回答查询,或非聚集索引可将数据库引擎指向基础表中的行。 一般来说,创建非聚集索引是为了提高聚集索引不涵盖的频繁使用的查询的性能,或在没有聚集索引的表(称为堆)中查找行。 可以对表或索引视图创建多个非聚集索引。

开始之前

典型实现

可以通过下列方法实现非聚集索引:

  • UNIQUE 约束

    在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。 有关详细信息,请参阅 Unique Constraints and Check Constraints

  • 独立于约束的索引

    默认情况下,如果未指定聚集,将创建非聚集索引。 对于每个表可创建的最大非聚集索引数为 999。 这包括使用 PRIMARY KEY 或 UNIQUE 约束创建的任何索引,但不包括 XML 索引。

  • 索引视图的非聚集索引

    对视图创建唯一的聚集索引后,便可以创建非聚集索引。 有关更多信息,请参阅“创建索引视图”。

安全性

权限

要求对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员,或者是 db_ddladmindb_owner 固定数据库角色的成员。

使用 SQL Server Management Studio

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

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

  2. 展开 “表” 文件夹。

  3. 右键单击你要创建非聚集索引的表,然后选择“设计”

  4. 右键单击要在其上创建非聚集索引的列,然后选择“索引/键”

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

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

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

  8. 选择“关闭”。

  9. 在“文件”菜单上,选择“保存 table_name”。

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

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

  2. 展开 “表” 文件夹。

  3. 展开要为其创建非聚集索引的表。

  4. 右键单击“索引”文件夹,指向“新建索引”,然后选择“非群集索引…”

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

  6. 在“索引键列”下,选择“添加…”

  7. 在“table_name 中选择列”对话框中,选中要添加到非聚集索引的一个或多个表列的复选框。

  8. 选择“确定”

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

“使用 Transact-SQL”

使用 Transact-SQL 在表上创建非聚集索引

  1. 在“对象资源管理器”中,连接到安装了 AdventureWorks2022 的数据库引擎的实例。 可以从示例数据库下载 AdventureWorks2022

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

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

    USE AdventureWorks2022;
    GO
    -- Find an existing index named IX_ProductVendor_VendorID and delete it if found.
    IF EXISTS (SELECT name FROM sys.indexes
                WHERE name = N'IX_ProductVendor_VendorID')
        DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor;
    GO
    -- Create a nonclustered index called IX_ProductVendor_VendorID
    -- on the Purchasing.ProductVendor table using the BusinessEntityID column.
    CREATE NONCLUSTERED INDEX IX_ProductVendor_VendorID
        ON Purchasing.ProductVendor (BusinessEntityID);
    GO