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