共用方式為


在線執行索引作業

本主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2014 中在線建立、重建或卸除索引。 ONLINE 選項可讓使用者在這些索引作業期間存取基礎表或叢集索引數據,以及任何相關聯的非叢集索引。 例如,當某個使用者正在重建叢集索引時,此使用者和其他人可以繼續更新和查詢基礎資料。 當您離線執行資料定義語言 (DDL) 作業時,例如建置或重建叢集索引;這些作業會保留基礎數據和相關聯索引的獨佔鎖定。 這可避免在索引作業完成之前對基礎資料進行修改和查詢。

備註

每個 SQL Server 版本都無法使用在線索引作業。 如需詳細資訊,請參閱 SQL Server 2014 版本支援的功能。

本主題內容

開始之前

限制與制約

  • 我們建議針對每天 24 小時、每周 7 天運作的商務環境執行在線索引作業,其中在索引作業期間需要並行用戶活動非常重要。

  • ONLINE 選項可在下列 Transact-SQL 語句中使用。

  • 如需有關在線建立、重建或卸除索引的更多限制,請參閱 在線索引作業的指導方針

安全

權限

需要擁有對資料表或檢視表的 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  
    

    下列範例會在線上刪除叢集索引,並利用 NewGroup 子句,將產生的資料表 (堆積) 移到 MOVE TO 檔案群組。 它會查詢 sys.indexessys.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)