FILL FACTOR

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

有効な FILL FACTOR 値は 1 ~ 100 (パーセント) です。ほとんどの場合、サーバー全体の既定値である 0 が最適な設定です。FILL FACTOR を 0 に設定すると、リーフ レベルは全容量が使用されます。

ms177459.note(ja-jp,SQL.90).gifメモ :
FILL FACTOR 値の 0 と 100 は、あらゆる点で同じ意味です。

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

ms177459.note(ja-jp,SQL.90).gif重要 :
FILL FACTOR の設定は、インデックスの作成時または再構築時にのみ適用されます。SQL Server 2005 データベース エンジンは、ページの空き領域として指定された割合の動的な維持は行いません。データ ページ上に余分な領域を維持しようとすると、本来の 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 操作を増加させる必要があるため、読み取りのパフォーマンスが低下します。

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

新しいデータがテーブル全体に均等に分散される場合は、ゼロ以外の FILL FACTOR を指定するとパフォーマンスが向上する可能性があります。ただし、すべてのデータがテーブルの最後に追加されると、空き領域は埋められません。たとえば、インデックス キー列が IDENTITY 列であると、新しい行のキーが常に増加し、行はテーブルの最後に論理的に追加されます。この場合、ページ分割によってパフォーマンスが低下することはありません。既定の FILL FACTOR 値 0 を使用するか、FILL FACTOR 値 100 を指定して、リーフ レベルの全容量が使用されるようにします。

参照

概念

インデックスの作成 (データベース エンジン)
FILL FACTOR オプション

その他の技術情報

ALTER INDEX (Transact-SQL)
CREATE INDEX (Transact-SQL)
sys.indexes (Transact-SQL)
sp_configure (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手