次の方法で共有


インデックス操作をオンラインで実行する

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server 2014 でインデックスをオンラインで作成、再構築、または削除する方法について説明します。 ONLINE オプションを使用すると、これらのインデックス操作中に、基になるテーブルまたはクラスター化インデックス データおよび関連付けられている非クラスター化インデックスに対する同時ユーザー アクセスが可能になります。 たとえば、クラスター化インデックスが 1 人のユーザーによって再構築されている間、そのユーザーとその他のユーザーは、基になるデータの更新とクエリを続行できます。 クラスター化インデックスの構築や再構築など、データ定義言語 (DDL) 操作をオフラインで実行する場合。これらの操作は、基になるデータと関連するインデックスに対する排他ロックを保持します。 これにより、インデックス操作が完了するまで、基になるデータに対する変更とクエリが防止されます。

オンライン インデックス操作は、すべての SQL Server エディションで使用できるわけではありません。 詳しくは「 Features Supported by the Editions of SQL Server 2014」をご覧ください。

このトピックについて

開始する前に

制限事項と制約条件

  • インデックス操作中の同時ユーザー アクティビティの必要性が不可欠な、1 日 24 時間、週 7 日動作するビジネス環境では、オンライン インデックス操作を実行することをお勧めします。

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

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

安全

権限

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

SQL Server Management Studio の使用

オンラインでインデックスを再構築するには

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

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

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

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

  5. オンラインで再構築するインデックスを右クリックし、[プロパティ] を選択 します

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

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

  8. OK をクリックします。

  9. オンラインで再構築するインデックスを右クリックし、[ 再構築] を選択します。

  10. [インデックスの再構築] ダイアログ ボックスで、再構築するインデックスに正しいインデックスがあることを確認し、[OK] をクリックします。

Transact-SQL の使用

オンラインでインデックスを作成、再構築、または削除するには

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。 この例では、既存のオンラインを再構築します。

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

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