次の方法で共有


オンラインでのインデックス操作の実行

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric プレビューの SQL データベース

この記事では、SQL Server Management Studio または Transact-SQL を使用して、オンラインでインデックスを作成、再構築、または削除する方法について説明します。 ONLINE オプションは、このようなインデックス操作中に基になるテーブルまたはクラスター化インデックス データ、ならびに関連付けられた任意の非クラスター化インデックスへ同時ユーザー アクセスを可能にします。 たとえば、あるユーザーがクラスター化インデックスを再構築している最中に、そのユーザーと他のユーザーが基になるデータの更新やクエリを続行できます。

クラスター化インデックスの構築や再構築など、データ定義言語 (DDL) 操作をオフラインで実行する場合、これらの操作は、基になるデータと関連するインデックスに対して排他 (X) ロックを保持します。 このため、インデックス操作が完了するまで、基になるデータの変更やクエリを実行できません。

Note

インデックスリビルドコマンドは、オンラインで実行されても、ラージ オブジェクト列がテーブルから削除された後、クラスター化インデックスに対して排他的ロックを保持する場合があります。

ONLINE オプションは、次の Transact-SQL ステートメントで利用できます。

オンラインでのインデックスの作成、再構築、または削除に関する制限事項と制限については、「 オンライン インデックス操作のガイドライン」を参照してください。

再開可能なインデックス操作を使用するには、インデックス操作をオンラインで実行する必要があります。 詳細については、「 再開可能なインデックスに関する考慮事項」を参照してください。

Supported platforms

オンラインのインデックス操作は、SQL Server のすべてのエディションには使用できません。 詳しくは、「SQL Server 2022 の各エディションとサポートされている機能」を参照してください。

オンラインのインデックス操作は、Azure SQL Database と Azure SQL Managed Instance で利用できます。

Permissions

テーブルまたはビューに対する ALTER 権限が必要です。

SQL Server Management Studio を使用します。

  1. オブジェクト エクスプローラーで、インデックスをオンラインで再構築するテーブルを含むデータベースを展開します。

  2. [テーブル] フォルダーを展開します。

  3. インデックスをオンラインで再構築するテーブルを展開します。

  4. [インデックス] フォルダーを展開します。

  5. オンラインで再構築するインデックスのコンテキスト メニューを使用し、[ プロパティ] を選択します。

  6. [ページの選択][オプション]を選択します。

  7. [DML のオンライン処理を許可する]を選択し、一覧から [True] を選択します。

  8. Select OK.

  9. オンラインで再構築するインデックスのコンテキスト メニューを使用し、[ 再構築] を選択します。

  10. [インデックスのリビルド]ダイアログ ボックスで、[リビルドするインデックス]グリッドに正しいインデックスが表示されていることを確認し、[はい]を選択します。

Use Transact-SQL

次の例では、 AdventureWorks サンプル データベース内の既存のオンライン インデックスを再構築します。

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

次の例では、クラスター化インデックスをオンラインで削除し、 NewGroup 句を使用することで、結果のテーブル (ヒープ) をファイル グループ MOVE TO に移動します。 移動の前後で sys.indexessys.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)」を参照してください。