适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 预览版中的 SQL 数据库
本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 联机创建、重新生成或删除索引。 
              ONLINE 选项允许并发用户在执行这些索引操作期间访问基础表或聚集索引数据和任何关联非聚集索引。 例如,一个用户正在重新生成聚集索引时,该用户和其他用户可以继续更新和查询基础数据。
脱机执行数据定义语言(DDL)作(例如生成或重新生成聚集索引)时,这些作将保留基础数据和关联索引的独占锁。X 这样可以防止在索引操作未完成时对基础数据进行修改和查询。
Note
从表中删除大型对象列后,索引重新生成命令可能会在聚集索引上保留排他锁,即使联机执行也不例外。
以下 Transact-SQL 语句中可以使用 ONLINE 选项。
- CREATE INDEX
- ALTER INDEX
- DROP INDEX
- 
              ALTER TABLE (添加或删除或UNIQUEPRIMARY KEY约束)
有关联机创建、重新生成或删除索引的限制和限制,请参阅 联机索引作指南。
若要使用可恢复索引作,必须联机执行索引作。 有关详细信息,请参阅 可恢复索引注意事项。
Supported platforms
在 SQL Server 的各版本中均不提供联机索引操作。 有关详细信息,请参阅 SQL Server 2022 的版本及其支持的功能。
联机索引操作可用于 Azure SQL 数据库和 Azure SQL 托管实例。
Permissions
              ALTER需要对表或视图具有权限。
使用 SQL Server Management Studio
- 在对象资源管理器中,展开包含要联机重新生成索引的表的数据库。 
- 展开 “表” 文件夹。 
- 展开要联机重新生成索引的表。 
- 展开 “索引” 文件夹。 
- 使用要联机重新生成索引的上下文菜单,然后选择“ 属性”。 
- 在 “选择页”下,选择 “选项”。 
- 选择 “允许联机 DML 处理”,然后从列表中选择 True 。 
- Select OK. 
- 使用要联机重新生成索引的上下文菜单,然后选择“ 重新生成”。 
- 在“重新生成索引”对话框中,确认正确的索引位于“要重新生成的索引”网格中,然后选择“确定”。 
Use Transact-SQL
以下示例在示例数据库中重新生成现有的联机索引 AdventureWorks 。
ALTER INDEX AK_Employee_NationalIDNumber
    ON HumanResources.Employee
    REBUILD WITH (ONLINE = ON);
以下示例使用 NewGroup 子句联机删除一个聚集索引并将生成表(堆)移动到文件组 MOVE TO 。 在移动之前和之后,将查询 sys.indexes、 sys.tables和 sys.filegroups 目录视图,以验证索引和表在文件组中的位置。
-- Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = 
            N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
    CREATE UNIQUE CLUSTERED INDEX
        AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials (ProductAssemblyID, ComponentID, 
        StartDate)
    ON 'PRIMARY';
GO
-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO
-- Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
                WHERE name = N'NewGroup')
    BEGIN
    ALTER DATABASE AdventureWorks2022
        ADD FILEGROUP NewGroup;
    ALTER DATABASE AdventureWorks2022
        ADD FILE (NAME = File1,
            FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
        TO FILEGROUP NewGroup;
    END
GO
-- Verify new filegroup
SELECT * from sys.filegroups;
GO
-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials 
    WITH (ONLINE = ON, MOVE TO NewGroup);
GO
-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');
有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。