現在、高度にフラグメント化されたインデックスを特定して再構築するために、週に 1 回実行される SQL エージェント ジョブがあります。大きなテーブルの特定の大きなインデックスでは、再構築中にインデックスを使用できないため、システムがタイムアウトする原因になります。
発生する断片化を大幅に削減する戦略を特定しましたが、それはしばらくの間実装されず、すべてを網羅しているわけではありません。
オンライン インデックスの再構築が可能な Enterprise エディションへのアップグレードをチェックインしました。ただし、この時点でのコストは法外です。
インデックスは実際にはそれほど変化しないため、少なくとも大部分は静的であると想定できます。
オンラインでのインデックスの再構築をシミュレートできる方法を想定していました。次のように機能します
特定された大規模なインデックスごとに、スクリプトを実行して次のことを行います。
- 断片化を確認し、特定のしきい値を超えている場合は続行します。
- CurrentIndex_TEMP という名前の新しいインデックスを作成します。
- インデックスの再構築を開始します。
- 一時索引を除去します。
一時インデックスが構築されると、ダウンタイムを発生させずに他のインデックスを再構築できるように思われます。これは、SQL Server が別のインデックスを使用して、別のクエリを使用していたクエリで使用できるようになるためです。
各一時インデックスは、他の一時インデックスが作成される前に削除されるため、インデックスごとにこれを繰り返すことで、インデックス全体のサイズの増加を最小限に抑えることができます。
この戦略では、インデックスの履歴データも保持されます。最初に現在のインデックスの名前を変更し、次に元の名前で再度作成し、名前が変更されたインデックスを削除するという戦略を当初は考えていました。ただし、これは履歴の損失につながります。
それで、私の質問...
これは実行可能な戦略ですか?遭遇する可能性のある重大な問題はありますか? これには時々手動での監視が必要になることは理解していますが、現時点では喜んで受け入れます。
助けてくれてありがとう。