5

テーブルの一括更新 (更新ごとに 1M を超える新しい行または更新された行) を可能にする方法の提供に取り組んでおり、現在のインデックスを削除して、更新後にそれらを再作成することに興味がありました。

これらの操作を疎結合して、時間の経過とともにインデックスが変更されても更新プロセスが変更されないようにするスクリプトを誰かが持っているかどうか疑問に思っていました。

これは、コミュニティがおそらくすでに解決したものの 1 つであるように思われます。

4

2 に答える 2

11

システム テーブルにクエリを実行してすべての非クラスター化インデックスをキャプチャし、無効にして完了時に再構築するために使用するスクリプトがあります。以下は標準版で使用するためのものです。エンタープライズ版の場合は、ONLINEオプションを追加します。

無効にする

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql)

再構築

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql);

条件に基づいて特定のテーブルを除外/含めることができ、カーソルを回避できるため、非常にカスタマイズ可能であるため、この方法が気に入っています。また、EXECを aに変更して、PRINT実行されるコードを確認し、手動で実行することもできます。

テーブルを除外する条件

AND o.name NOT IN ('tblTest','tblTest1');
于 2012-07-02T22:02:38.850 に答える
4
EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? DISABLE'

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? REBUILD'

すべてのテーブルとすべてのインデックスに対して実行する場合は、これで十分です。

于 2012-07-02T22:07:28.860 に答える