SQL Serverのインデックスの断片化は、データベースのパフォーマンス低下の一般的な原因です。断片化は、データページに多くの空きスペースがある場合(内部断片化)、またはインデックス内のページの論理的な順序がデータファイル内のページの物理的な順序と一致しない場合(外部断片化)に発生します。
フラグメンテーション関連のパフォーマンスの問題は、インデックススキャンを実行するクエリを実行するときに最も頻繁に観察されます。インデックスシークを実行するクエリは、高インデックスの断片化の影響を受けない場合があります。
SQLServerインデックスの断片化の種類を理解する
内部インデックスの断片化
内部フラグメンテーションは、データページの空き領域が多すぎる場合に発生します。この余分なスペースは、いくつかの異なる方法で導入されます:
- SQLServerは8KBページにデータを保存します。したがって、8 KB未満のデータをテーブルに挿入すると、ページに空白が残ります。
- 逆に、ページにスペースがあるよりも多くのデータを挿入すると、超過分は別のページに送信されます。追加のデータが後続のページを完全に埋める可能性は低いため、ここでも、ページに空白が残ります。
- データページの空白は、データがテーブルから削除されたときにも発生します。
内部フラグメンテーションは、SQLServerがインデックススキャンを実行するときに主にパフォーマンスの問題を引き起こします。 SQL Serverが探しているデータを見つけるために部分的に埋められた多くのページをスキャンする必要がある場合、パフォーマンスが低下します。
外部インデックスの断片化
外部の断片化は、データページの順序が乱れている結果です。これは、フルリーフページへのデータの挿入または更新が原因で発生します。データがページ全体に追加されると、SQL Serverは追加のデータに対応するためにページ分割を作成し、新しいページは元のページから分離されます。
外部フラグメンテーションは、ランダムI / Oを増やすことにより、パフォーマンスの問題を引き起こします。ページが連続していない場合、SQL Serverは複数の場所からデータを読み取る必要があり、順番に読み取るよりも時間がかかります。
SQLServerインデックスの断片化を回避する方法
インデックスの断片化を完全に防ぐことはできませんが、その発生を最小限に抑え、データベースのパフォーマンスに対する断片化の影響を軽減する方法があります。 SQLServerインデックスの断片化を回避するための推奨事項と禁止事項は次のとおりです。
実行: 値が増加し続ける、または値が減少するクラスターキーを選択します。レコードを挿入すると、論理ページチェーンの最初または最後に配置されるため、これによりページ分割が減少します。
禁止事項: ランダムなキー値を持つレコードを挿入します。静的キー値を選択して、レコードが配置されると、移動する必要がなく、順序が乱れないようにします。
禁止事項: レコードを更新して長くします。更新中にインデックスにレコードを追加するには、SQLServerがデータの一部を新しいページにプッシュする必要がある場合があります。これにより、リーフページが連続せず、最終的にはパフォーマンスの問題が発生する可能性があります。
禁止事項: インデックスキー列を更新します。キー列の更新には、新しいキー値を使用した完全な行の削除とそれに続く完全な行の挿入が必要です。十分なスペースがないページに新しい行が挿入されると、ページが分割されます。
実行: ページ分割を引き起こす可能性のある機能に注意してください。インデックスを含む機能を変更すると、最終的に生じる可能性があることに注意してください。たとえば、クラスター化インデックスの可変幅列(非キー列でも)を更新すると、ページ分割が発生する可能性があります。
実行: 適切なインデックスフィルファクターを実装します。デフォルトの曲線因子設定で断片化を分析し、必要に応じて調整して、通常の負荷での過度の断片化を最小限に抑えます。
SQLServerインデックスの断片化を修正する方法
断片化を100%防止することは不可能であるため、パフォーマンスが低下している場合にSQLServerインデックスの断片化を修正する方法を知ることが重要です。
SQL Serverのインデックスの断片化の問題に取り組む方法を決定する前に、まず、対処している問題の範囲を決定する必要があります。
開始するのに最適な場所は、sys.dm_db_index_physical_stats DMFを使用して、インデックスの断片化レベルを分析することです。インデックスの断片化がどれほど広範囲に及ぶかがわかったら、3つのソリューションのいずれかを使用して攻撃の計画を立てることができます。インデックスを再構築するか、インデックスを再編成するか、何もしません。
再構築: 断片化が30%を超えたら、インデックスを再構築します。
再編成: 11〜30パーセントの断片化でインデックスを再編成します。
無視: 断片化レベルが10%以下であれば、パフォーマンスの問題は発生しないため、何もする必要はありません。
SQL Serverのインデックスの断片化は避けられませんが、データベースのパフォーマンスに対する断片化の悪影響を最小限に抑えることができます。いくつかの簡単なベストプラクティスに従い、スケジュールされたメンテナンスを常に把握して、断片化に関連する主要なパフォーマンスの問題を軽減します。