データベースでタスクを実行するために DTS を実行しています。最初に、データベース内のすべてのインデックスを無効にし、DTS が作業を終了したら再度有効にする必要があります。
データベース全体のすべてのインデックスを無効にしてから、すべてを再度有効にする方法はありますか?
1 つずつ無効化/有効化する方法を知っています。DTS の手順として、一度にすべてを無効化/有効化する方法を教えてください。
データベースでタスクを実行するために DTS を実行しています。最初に、データベース内のすべてのインデックスを無効にし、DTS が作業を終了したら再度有効にする必要があります。
データベース全体のすべてのインデックスを無効にしてから、すべてを再度有効にする方法はありますか?
1 つずつ無効化/有効化する方法を知っています。DTS の手順として、一度にすべてを無効化/有効化する方法を教えてください。
以下のスクリプトを使用してインデックスを無効にすることができます
ALTER INDEX ALL ON [TableName]
DISABLE;
テーブルへの一括挿入を行い、以下のスクリプトを実行します。
ALTER INDEX ALL ON [TableName]
REBUILD;
データベース内のすべての非クラスター化インデックスに対して ALTER ステートメントを出力するスクリプトを次に示します。これを簡単に変更して、REBUILD スクリプトとクラスター化インデックス用のスクリプトを出力できます。
select 'ALTER INDEX [' + I.name + '] ON [' + T.name + '] DISABLE'
from sys.indexes I
inner join sys.tables T on I.object_id = T.object_id
where I.type_desc = 'NONCLUSTERED'
and I.name is not null
このスクリプトを使用して、すべてのインデックスを無効にします
-- Disable All Indices
DECLARE @Script NVARCHAR(MAX)
DECLARE curIndices CURSOR FAST_FORWARD READ_ONLY FOR
SELECT 'ALTER INDEX ' + QUOTENAME(indices.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(tableNames.schema_id))+'.'+ QUOTENAME(tableNames.name) + ' DISABLE'
FROM
sys.indexes indices INNER JOIN
sys.tables tableNames ON indices.object_id = tableNames.object_id
WHERE
indices.type_desc = 'NONCLUSTERED' AND
indices.name IS NOT NULL AND
indices.is_disabled = 0;
OPEN curIndices
FETCH NEXT FROM curIndices INTO @Script
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Script
EXECUTE sp_executesql @Script
FETCH NEXT FROM curIndices INTO @Script
END
CLOSE curIndices
DEALLOCATE curIndices
このスクリプトを使用して、すべてのインデックスを再構築 (有効化) します
-- Rebuild All Indices
DECLARE @Script NVARCHAR(MAX)
DECLARE curIndices CURSOR FAST_FORWARD READ_ONLY FOR
SELECT 'ALTER INDEX ' + QUOTENAME(indices.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(tableNames.schema_id))+'.'+ QUOTENAME(tableNames.name) + ' REBUILD'
FROM
sys.indexes indices INNER JOIN
sys.tables tableNames ON indices.object_id = tableNames.object_id
WHERE
indices.type_desc = 'NONCLUSTERED' AND
indices.name IS NOT NULL AND
indices.is_disabled = 1;
OPEN curIndices
FETCH NEXT FROM curIndices INTO @Script
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Script
EXECUTE sp_executesql @Script
FETCH NEXT FROM curIndices INTO @Script
END
CLOSE curIndices
DEALLOCATE curIndices
テーブルとインデックスのメタデータを選択するスクリプトを実行する必要があります。次に、次のことができます。
ALTER INDEX indexname ON tablename DISABLE;
後で同様のスクリプトを実行して再構築できます。
ALTER INDEX indexname ON tablename REBUILD;
これらを一度に 1 つずつ実行するか、NVARCHAR(MAX) 変数にまとめて 1 つのバッチとして実行することができます。この以前の質問でサンプル コードを確認できます。