2012-07-02 12 views
5

私はテーブルを一括更新できるメソッドを提供しています(更新ごとに1Mの新規または更新された行が1Mより大きい)、現在のインデックスを削除して更新後に再作成することに関心がありました。現在のインデックスを自動的に削除して再作成する

これらの操作の緩やかな結合を提供するスクリプトを誰かが持っていて、インデックスが時間の経過とともに変化すると、更新処理が変更されないのだろうかと思いました。

これは、コミュニティがすでに解決しているようなもののようです。

+2

適切なタグ(Oracle、SQL Server、MySQLなど)を追加して、ターゲットとするRDBMSを指定してください。普遍的にサポートされていない言語や製品の機能を利用した回答があります。また、特定のRDBMSにタグを付けることで、あなたの質問に答えるのに適した人からあなたの質問が注目されるかもしれません。 – Ben

答えて

10

私は、クラスタ化されていないすべてのインデックスをキャプチャし、完了時に再構築を無効にするためにシステムテーブルをクエリするスクリプトを使用しています。以下は標準版での使用です。企業にいる場合は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); 

再構築カーソル。またEXECPRINTに変更し、実行して手動で実行するコードを参照してください。

条件テーブルを除外する

AND o.name NOT IN ('tblTest','tblTest1'); 
+1

恐ろしい! Not Inを反転させるだけです。ドロップよりもはるかに簡単で、私がやろうとしていたことを作成する –

+1

'sys.objects'の代わりに' sys.tables'を使用して、いつでも 'WHERE o.type_desc = 'USER_TABLE''を指定する必要がありません.... –

4
EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? DISABLE' 

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? REBUILD' 

を使用すると、すべてのテーブルとすべてのインデックスのためにそれをしたい場合は、あなたが必要とするすべてです。

+0

私はそれに問題があります。無効なクラスタ化インデックスを持つテーブルは、テーブルが無効になるため、挿入された行を取得できません。 – Stoleg

+0

これは独立した質問としてお尋ねください。情報が少なすぎます... – fancyPants

+0

クラスタ化インデックスが無効なテーブルでINSERT INTOが失敗します。無効なクラスタード・インデックスを持つ表のデータ行は、ドロップまたは再構築操作でのみ使用できます。 – Stoleg

関連する問題