联机执行索引作

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中联机创建、重新生成或删除索引。 ONLINE 选项允许并发用户访问基础表或聚集索引数据以及这些索引作期间任何关联的非聚集索引。 例如,当群集索引被一个用户重新生成时,该用户和其他人可以继续更新和查询基础数据。 脱机执行数据定义语言(DDL)作时,例如生成或重新生成聚集索引;这些作保留基础数据和关联索引的排他锁。 这可以防止修改和查询基础数据,直到索引作完成。

注释

联机索引作在每个 SQL Server 版本中都不可用。 有关详细信息,请参阅 SQL Server 2014 各个版本支持的功能

本主题内容

在您开始之前

局限性与限制

  • 我们建议对每天运行 24 小时、每周 7 天的业务环境执行联机索引作,在这些环境中,在索引作期间需要并发用户活动至关重要。

  • 以下 Transact-SQL 语句中提供了 ONLINE 选项。

  • 有关联机创建、重新生成或删除索引的更多限制和限制,请参阅 联机索引作指南

安全

权限

需要对表或视图具有 ALTER 权限。

使用 SQL Server Management Studio

联机重新生成索引

  1. 在对象资源管理器中,单击加号以展开包含要联机重新生成索引的表的数据库。

  2. 展开 表格 文件夹。

  3. 单击加号以展开要联机重新生成索引的表。

  4. 展开 “索引” 文件夹。

  5. 右键单击要联机重新生成索引并选择“ 属性”。

  6. “选择页面”下,选择“ 选项”。

  7. 选择 “允许联机 DML 处理”,然后从列表中选择 True

  8. 单击 “确定”

  9. 右键单击要联机重新生成的索引,然后选择“ 重新生成”。

  10. 在“ 重新生成索引 ”对话框中,验证正确的索引是否位于 “索引”中以重新生成 网格,然后单击“ 确定”。

使用 Transact-SQL

联机创建、重新生成或删除索引

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

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

  3. 将以下示例复制并粘贴到查询窗口中,然后单击 执行。 该示例重新生成现有联机

    USE AdventureWorks2012;  
    GO  
    ALTER INDEX AK_Employee_NationalIDNumber ON HumanResources.Employee  
    REBUILD WITH (ONLINE = ON);  
    GO  
    

    以下示例联机删除聚集索引,并使用MOVE TO子句将生成的表(堆)移动到文件组NewGroupsys.indexes查询目录sys.tablessys.filegroups视图,以验证移动前后文件组中的索引和表位置。

    USE AdventureWorks2012;
    GO
    --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 AdventureWorks2012
            ADD FILEGROUP NewGroup;
        ALTER DATABASE AdventureWorks2012
            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');
    GO
    

有关详细信息,请参阅 ALTER INDEX (Transact-SQL)