いくつかのデータベースと 1000 を超えるテーブルを維持する必要があるため、トリガーを使用して自動的にインデックスの断片化レベルを特定の値以下に維持することを考えました。
今は時間がないので、コードは提供されません。もちろん、それを行う方法については、頭の中にいくつかの一般的なスキーマがあります。トリガーを作成できます。インデックスの断片化値を見つける方法を知っています。しかし、多くのテストと広範なドキュメントの読み取りがなければ、バグを減らし、可能な限り最適化する方法がわかりません。トリガーとその制限についてほとんど知らないため、不可能でさえある可能性があり、このタスクを達成するために必要ないくつかの操作がトリガーで許可されない可能性があります。
たとえば、いくつかのことが気になります:
- オンラインまたはオフラインのインデックスを使用する
- そのようなトリガーはクエリをクラッシュさせる可能性がありますか
- タイムアウトのため、単一の行の更新後ではなく、完全なクエリが終了したときにトリガーを実行する可能性があるため、インデックスが即座に再構築されるため、クラッシュすることはありません
では、そのようなタスクを最適な方法で達成するにはどうすればよいでしょうか? そのようなトリガーがクエリのパフォーマンスにどのように影響するかについての情報も高く評価されます。
編集: リクエストのため、いくつかのコードを提供します。完全な解決策になる可能性がありますが、トリガーがトリガーされるとエラー メッセージが生成されます。
CREATE TRIGGER defragmentator ON [schema].[table]
AFTER INSERT, UPDATE
AS
DECLARE @fragRate float;
SELECT @fragRate = a.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(N'MyDB'), OBJECT_ID(N'[schema].[table]'), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
WHERE b.name = 'IDX_name';
IF @fragRate > 50
ALTER INDEX IDX_name ON [schema].[table]
REBUILD
GO
それを改善する方法は?