web-dev-qa-db-ja.com

SQL Serverはどのようにしてインデックスの断片化を減らしますか?

ユーザーが自分のデータベースでREBUILDまたはREORGANIZEを実行しない場合でも、SQL Serverは何らかの方法でインデックスを最適化しますか?

MSDNは、インデックスが30%以上断片化されている場合、REBUILDではなくREORGANIZEを実行することを推奨しています。 REORGANIZEを複数回実行すると、REBUILDと同じことを実行できますか?

非常に断片化されたインデックスを持つクライアントがあるので、これについて疑問に思います。彼らは毎週末そのインデックスに対してREORGANIZEを実行しており、時間の経過とともにインデックスが最適化されるようです。

これは理にかなっていますか?

7
dsum

いいえ、インデックスの自動的なデフラグはありません。断片化がある場合は、REBUILDまたはREORGANIZEを実行する必要があります。

インデックスを再編成すると、ページを物理的に並べ替えて論理的な順序と一致させることにより、インデックスのリーフレベルを最適化します。ロック期間は短く、クエリのブロックを最小限に抑えます。

Rebuildはインデックスを削除し、新しいインデックスを作成します。 Enterpriseエディションでは、インデックスにLOBタイプが含まれていない場合、これはオンライン操作として実行できます。 Standardエディションの場合、またはLOBタイプが存在する場合は、ブロッキングが発生します。ユーザーの操作と同時にオンラインの再構築を実行する方法については、 オンラインインデックス操作のしくみ を参照してください。

再編成と再構築の推奨値は、再編成によるデフラグに必要な作業量が再構築に匹敵するおおよそのしきい値です。つまり、30%を超える断片化では、再構築よりも再編成を完了するためにより多くのリソースと長い経過時間が必要になります。

複数の再編成を実行しても、インデックスはさらに最適化されません。

11

ユーザーがデータベースでREBUILDまたはREORGANIZEを実行しない場合、SqlServerエンジンはインデックスを最適化しますか?

番号。

REORGANIZEを複数回実行すると、REBUILDと同じことが行われます

いいえ。

REORGANIZEは、リーフページ(実際のインデックスデータを保持するページ)を、インデックスの仕様に従って正しい順序に並べ替えます。ページを統合して空のページを削除することもできますが、新しいページは割り当てられず、btree構造と統計情報は再構築されません。

REBUILDは古いインデックスを削除し、最初から作成します。これにより、すべてのBツリー構造が更新され、不要なスラックスペースが削除され、断片化が0(またはデータベースの空きページの連続性が許す限り0に近い値)に置かれます。

6
JNK

SQL Serverは、いかなる種類の自動メンテナンスも行いません。

REORGANIZEを複数回実行しても、最初の実行が成功した後は効果がありません(再編成後に変更されたページや、ロックできなかったために最初の試行でスキップされたページは無視されます)。

順不同のページを正しい順序にスワップするので、それが完了してすべてが正しい順序になれば、追加の実行は効果がありません。不連続な割り当てが原因で発生する断片化を取り除くことはできません。そのためには、再構築する必要があります。

5
Martin Smith

既存の回答にいくつかのポイントを追加したいと思います:

4
gonsalu