2

現在、高度にフラグメント化されたインデックスを特定して再構築するために、週に 1 回実行される SQL エージェント ジョブがあります。大きなテーブルの特定の大きなインデックスでは、再構築中にインデックスを使用できないため、システムがタイムアウトする原因になります。

発生する断片化を大幅に削減する戦略を特定しましたが、それはしばらくの間実装されず、すべてを網羅しているわけではありません。

オンライン インデックスの再構築が可能な Enterprise エディションへのアップグレードをチェックインしました。ただし、この時点でのコストは法外です。

インデックスは実際にはそれほど変化しないため、少なくとも大部分は静的であると想定できます。

オンラインでのインデックスの再構築をシミュレートできる方法を想定していました。次のように機能します

特定された大規模なインデックスごとに、スクリプトを実行して次のことを行います。

  • 断片化を確認し、特定のしきい値を超えている場合は続行します。
  • CurrentIndex_TEMP という名前の新しいインデックスを作成します。
  • インデックスの再構築を開始します。
  • 一時索引を除去します。

一時インデックスが構築されると、ダウンタイムを発生させずに他のインデックスを再構築できるように思われます。これは、SQL Server が別のインデックスを使用して、別のクエリを使用していたクエリで使用できるようになるためです。

各一時インデックスは、他の一時インデックスが作成される前に削除されるため、インデックスごとにこれを繰り返すことで、インデックス全体のサイズの増加を最小限に抑えることができます。

この戦略では、インデックスの履歴データも保持されます。最初に現在のインデックスの名前を変更し、次に元の名前で再度作成し、名前が変更されたインデックスを削除するという戦略を当初は考えていました。ただし、これは履歴の損失につながります。

それで、私の質問...

これは実行可能な戦略ですか?遭遇する可能性のある重大な問題はありますか? これには時々手動での監視が必要になることは理解していますが、現時点では喜んで受け入れます。

助けてくれてありがとう。

4

1 に答える 1

3

重複したインデックスを作成しても何も得られないように、テーブルをロックしてオフラインでインデックスを再構築します。

多大な努力を払って、オンライン インデックスの再構築をシミュレートできます。テーブルのすべてのインデックスを一度に再構築する必要があります。

  1. T同一のスキーマ (" T_new")を持つテーブルのコピーを作成します
  2. Tに名前を変更T_old
  3. Tとして定義されたビューを作成し、と の両方ですべての DML を実行する DML トリガーをselect * from T_old設定します。INSTEAD OFT_oldT_new
  4. バックグラウンド ジョブでは、ステートメントT_oldT_new使用してから にバッチをコピーしますMERGE
  5. 最後に、コピーが完了したら、名前の変更と削除を実行してT_new、新しいものを作成しますT

これには、非常に多くの労力と適切なテストが必要です。しかし、これをオンラインで使用すると、ほとんど任意のスキーマ変更を実現できます。

于 2012-12-12T21:40:16.837 に答える