FILL FACTOR

FILL FACTOR オプションは、インデックス データ ストレージとパフォーマンスの微調整を行うために用意されています。インデックスの作成または再構築を行うとき、各リーフ レベルのページのデータを格納する領域の割合が FILL FACTOR 値によって決まり、今後インデックスのサイズが大きくなる場合に備えて指定した各ページ上の残りの空き領域が予約されます。たとえば、FILL FACTOR 値を 80 に指定すると、基になるテーブルにデータを追加したときにインデックスのサイズを拡張するための領域として、各リーフ レベルのページの 20% が空き領域として確保されます。空き領域は、インデックスの最後ではなく、インデックス行の間に確保されます。

有効な FILL FACTOR 値は 1 ~ 100 (パーセント) です。サーバー全体の既定値は 0 で、これはリーフ レベルのページの全容量が使用されることを意味します。

注意注意

FILL FACTOR 値 0 と 100 の機能は、まったく同じです。

CREATE INDEX ステートメントまたは ALTER INDEX ステートメントを使用して、インデックスごとに FILL FACTOR 値を設定できます。サーバー全体の既定値を変更するには、sp_configure システム ストアド プロシージャを使用します。1 つ以上のインデックスの FILL FACTOR 値を表示するには、sys.indexes を使用します。

重要な注意事項重要

FILL FACTOR の設定は、インデックスの作成時または再構築時にのみ適用されます。SQL Server データベース エンジンは、ページの空き領域として指定された割合の動的な維持は行いません。データ ページ上に余分な領域を維持しようとすると、本来の FILL FACTOR の使用目的に反することになります。FILL FACTOR で指定された空き領域の割合を各ページで維持するためには、データの入力中であってもページ分割を実行する必要性が発生し得るためです。

パフォーマンスに関する考慮事項

ページ分割

適切な FILL FACTOR 値を選択すると、基になるテーブルにデータが追加されたときにインデックスのサイズを拡張するのに十分な領域が確保され、ページ分割が実行される可能性が低くなります。フル インデックス ページに新しい行を追加すると、新しい行を挿入する領域を確保するために、データベース エンジンにより行の約半分が新しいページに移動されます。この再構成をページ分割といいます。ページ分割により新しいレコード用の領域が確保されますが、この操作の実行には時間がかかることがあります。また、ページ分割はリソースを集中的に消費する操作です。さらに、I/O 操作を増加させる断片化の原因となることもあります。ページ分割が頻繁に行われる場合は、新規または既存の FILL FACTOR 値を使用してデータを再配布して、インデックスを再構築できます。詳細については、「インデックスの再編成と再構築」を参照してください。

FILL FACTOR 値を 0 以外の小さな値に設定すると、インデックスのサイズが大きくなったときにページを分割する必要性を減少させることができますが、さらに多くの保存領域が必要になり、読み取りのパフォーマンスが低下する場合があります。挿入や更新が頻繁に実行されるアプリケーションでも、データベース読み取り回数はデータベース書き込み回数よりも 5 ~ 10 倍多くなるのが普通です。したがって、既定値以外の FILL FACTOR 値を指定すると、FILL FACTOR の設定に反比例してデータベース読み取りのパフォーマンスが低下する可能性があります。たとえば、FILL FACTOR 値を 50 に指定すると、データベース読み取りのパフォーマンスが 1/2 に低下することがあります。インデックスに多くのページが含まれていて、データを取得するには、ディスク I/O 操作を増加させる必要があるため、読み取りのパフォーマンスが低下します。

テーブルの最後へのデータの追加

新しいデータがテーブル全体に均等に分散される場合は、0 および 100 以外の FILL FACTOR を指定するとパフォーマンスが向上する可能性があります。ただし、すべてのデータがテーブルの最後に追加されると、インデックス ページ内の空き領域は埋められません。たとえば、インデックス キー列が IDENTITY 列であると、新しい行のキーが常に増加し、インデックス行はインデックスの最後に論理的に追加されます。行のサイズを大きくするデータで既存の行が更新される場合は、FILL FACTOR 値を 100 未満にしてください。各ページ上の追加のバイトにより、行の追加の長さによって発生するページ分割を最小限にすることができます。