オンラインでのインデックス操作の実行
このトピックでは、SQL Server 2012 で SQL Server Management Studio または Transact-SQL を使用して、インデックスをオンラインで作成、再構築、または削除する方法について説明します。 ONLINE オプションにより、このようなインデックス操作中に、基になるテーブルやクラスター化インデックス データ、および関連付けられた任意の非クラスター化インデックスへの同時ユーザー アクセスが可能になります。 たとえば、あるユーザーがクラスター化インデックスを再構築している最中に、そのユーザーと他のユーザーが基になるデータの更新やクエリを続行できます。 クラスター化インデックスの構築や再構築などのデータ定義言語 (DDL) 操作をオフラインで実行するときは、これらの操作により、基になるデータや関連付けられたインデックスに排他ロックがかけられます。 このため、インデックス操作が完了するまで、基になるデータの変更やクエリを実行できません。
注 |
---|
オンラインでのインデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。 詳細については、「SQL Server 2012 の各エディションがサポートする機能」を参照してください。 |
このトピックの内容
作業を開始する準備:
制限事項と制約事項
セキュリティ
インデックスをオンラインで再構築するために使用するもの:
SQL Server Management Studio
Transact-SQL
作業を開始する準備
制限事項と制約事項
1 日 24 時間、週 7 日間、常時稼動のビジネス環境では、オンラインでのインデックス操作を実行することをお勧めします。このような環境では、インデックスの操作中に、ユーザーが同時に操作できることが必要不可欠です。
次の Transact-SQL ステートメントで、ONLINE オプションを使用できます。
ALTER TABLE (CLUSTERED インデックス オプションが指定されている UNIQUE 制約または PRIMARY KEY 制約を追加または削除するため)
オンラインでのインデックスの作成、再構築、または削除に関する制限と制約については、「オンライン インデックス操作のガイドライン」を参照してください。
セキュリティ
権限
テーブルまたはビューに対する ALTER 権限が必要です。
[Top]
SQL Server Management Studio の使用
インデックスをオンラインで再構築するには
オブジェクト エクスプローラーで、インデックスをオンラインで再構築するテーブルが格納されているデータベースをプラス記号をクリックして展開します。
[テーブル] フォルダーを展開します。
プラス記号をクリックして、オンラインでインデックスを再構築するテーブルを展開します。
[インデックス] フォルダーを展開します。
オンラインで再構築するインデックスを右クリックし、[プロパティ] を選択します。
[ページの選択] の [オプション] を選択します。
[DML のオンライン処理を許可する] を選択し、一覧から [True] を選択します。
[OK] をクリックします。
オンラインで再構築するインデックスを右クリックし、[再構築] を選択します。
[インデックスの再構築] ダイアログ ボックスで、[再構築するインデックス] グリッドに目的のインデックスが表示されていることを確認し、[OK] をクリックします。
[Top]
Transact-SQL の使用
インデックスをオンラインで作成、再構築、または削除するには
オブジェクト エクスプローラーで、データベース エンジンのインスタンスに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
次の例をコピーしてクエリ ウィンドウに貼り付け、[実行] をクリックします。 この例では、既存のインデックスをオンラインで再構築します。
USE AdventureWorks2012; GO ALTER INDEX AK_Employee_NationalIDNumber ON HumanResources.Employee REBUILD WITH (ONLINE = ON); GO
次の例では、クラスター化インデックスをオンラインで削除し、MOVE TO 句を使用することで、結果のテーブル (ヒープ) をファイル グループ NewGroup に移動します。 移動の前後で sys.indexes、 sys.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)」を参照してください。
[Top]