SQL Server 2008で、DB内のすべての非クラスター化インデックスをセカンダリファイルグループに移動したいと思います。これを行う最も簡単な方法は何ですか?
3 に答える
この更新されたスクリプトを実行して、と呼ばれるストアドプロシージャを作成しますMoveIndexToFileGroup
。この手順では、テーブル上のすべての非クラスター化インデックスを指定されたファイルグループに移動します。INCLUDE
他のスクリプトではサポートされていない列もサポートしています。さらに、目的のファイルグループにすでに存在するインデックスを再構築または移動することはありません。プロシージャを作成したら、次のように呼び出します。
EXEC MoveIndexToFileGroup @DBName = '<your database name>',
@SchemaName = '<schema name that defaults to dbo>',
@ObjectNameList = '<a table or list of tables>',
@IndexName = '<an index or NULL for all of them>',
@FileGroupName = '<the target file group>';
データベース内のテーブルごとにこれを実行するスクリプトを作成するには、クエリ出力をテキストに切り替えて、次のコマンドを実行します。
SELECT 'EXEC MoveIndexToFileGroup '''
+TABLE_CATALOG+''','''
+TABLE_SCHEMA+''','''
+TABLE_NAME+''',NULL,''the target file group'';'
+char(13)+char(10)
+'GO'+char(13)+char(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
詳細については、元のブログを参照してください。この手順は作成しませんでしたが、ブログの回答に従って更新し、SQLServer2005と2008の両方で機能することを確認しました。
更新
- @psteffekは、SQLServer2012で動作するようにスクリプトを変更しました。私は彼の変更をマージしました。
IGNORE_DUP_KEY
テーブルにオプションがオンになっていると、手順は失敗します。これに対する修正はまだありません。- @srutzkyは、この手順はインデックスの順序を維持することを保証するものではないと指摘し、それを修正する方法について提案しました。それに応じて手順を更新しました。
- ojiNYは、この手順でインデックスフィルターが省略されていることを指摘しました(SQL 2005との互換性のため)。彼の提案に従って、私はそれらをに追加し直しました。
それらをスクリプト化し、ON句を変更し、それらを削除し、新しいスクリプトを再実行します。本当に代替手段はありません。
幸いなことに、このようなInterwebには、スクリプトを処理するスクリプトがあります。
更新:MS SQL Server Manager 2008R2以前を使用している場合、この手順2を手動で実行するには長い時間がかかります。私はSQLServerManager 2014を使用したので、うまく機能します(ドロップをエクスポートしてインデックスを作成する方法は簡単に変更できるため)
SQL Server 2014でスクリプトを実行しようとしましたが、問題が発生しました。怠惰すぎて問題を検出できません。 、だから私はあなたが実行しているSQLサーバーのバージョンに依存しない別の解決策を思いつきます。
2.スクリプトを更新し、ドロップ作成テーブルに関連するすべてのものを削除し、それらをインデックスに属するようにします。元のインデックスを新しいインデックスに置き換えます(私の場合、ON[PRIMARY]をON[SECONDARY][ ] 5に置き換えます。
- スクリプトを実行してください!そして、それが完了するまで待ちます。
(他の環境で実行するためにスクリプトを保存することをお勧めします)。