次の方法で共有


インデックスの Fill Factor を指定する

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server 2014 のインデックスに対して fill factor 値を指定する方法と、FILL FACTOR の概要について説明します。

インデックス データのストレージとパフォーマンスを微調整するために、fill-factor オプションが用意されています。 インデックスが作成または再構築されると、fill-factor 値によって、データが格納される各リーフ レベル ページの領域の割合が決まります。各ページの残りの部分は、将来の拡張のための空き領域として予約されます。 たとえば、塗りつぶし係数の値を 80 に指定すると、各リーフ レベル ページの 20% が空のままになり、基になるテーブルにデータが追加されるときにインデックスを拡張するための領域が提供されます。 空の領域は、インデックスの末尾ではなく、インデックス行間で予約されます。

fill-factor 値は 1 から 100 までのパーセンテージで、サーバー全体の既定値は 0 です。これは、リーフレベルのページが容量までいっぱいにされることを意味します。

Fill-factor 値 0 と 100 は、すべての点において等しいです。

このトピックについて

開始する前に

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

ページ分割

正しく選択されたフィルファクター値を使用すると、基になるテーブルにデータが追加されるときにインデックスを拡張するための十分な領域を提供することで、ページ分割の可能性を減らすことができます。新しい行が完全なインデックス ページに追加されると、データベース エンジンは約半分の行を新しいページに移動して、新しい行を格納します。 この再編成は、ページ分割と呼ばれます。 ページ分割を使用すると、新しいレコードを作成できますが、実行に時間がかかる可能性があり、リソースを大量に消費する操作です。 また、断片化が発生して I/O 操作が増加する可能性があります。 ページ分割が頻繁に発生する場合は、新規または既存のフィルファクター値を使用してデータを再配布することで、インデックスを再構築できます。 詳細については、「 インデックスの再編成と再構築」を参照してください。

0 以外の値を小さくすると、インデックスのサイズが大きくなるとページを分割する必要が減る可能性がありますが、インデックスのストレージ領域が増え、読み取りパフォーマンスが低下する可能性があります。 多くの挿入操作や更新操作を行うアプリケーションの場合でも、通常、データベース読み取りの数はデータベース書き込みの数を 5 から 10 倍上回ります。 そのため、既定以外のフィル ファクターを指定すると、フィルファクターの設定に反比例してデータベースの読み取りパフォーマンスが低下する可能性があります。 たとえば、fill-factor 値が 50 の場合、データベースの読み取りパフォーマンスが 2 倍低下する可能性があります。 インデックスに含まれるページ数が多いため、読み取りパフォーマンスが低下するため、データの取得に必要なディスク IO 操作が増加します。

テーブルの末尾にデータを追加する

新しいデータがテーブル全体に均等に分散されている場合は、0 または 100 以外の 0 以外のフィル ファクターがパフォーマンスに適している可能性があります。 ただし、すべてのデータがテーブルの末尾に追加された場合、インデックス ページ内の空の領域は埋め込まれません。 たとえば、インデックス キー列が IDENTITY 列の場合、新しい行のキーは常に増加し、インデックス行はインデックスの末尾に論理的に追加されます。 既存の行が、行のサイズを長くするデータで更新される場合は、100 未満のフィル ファクターを使用します。 各ページの余分なバイトは、行の余分な長さによるページ分割を最小限に抑えるのに役立ちます。

安全

権限

テーブルまたはビューに対する ALTER 権限が必要です。 実行するには、 sysadmin 固定サーバー ロール、または db_ddladmin 固定データベース ロールおよび db_owner 固定データベース ロールのメンバーである必要があります。

SQL Server Management Studio の使用

テーブル デザイナーを使用してフィル ファクターを指定するには

  1. オブジェクト エクスプローラーで、プラス記号をクリックして、インデックスの塗りつぶし係数を指定するテーブルを含むデータベースを展開します。

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。

  3. インデックスの塗りつぶし係数を指定するテーブルを右クリックし、[ デザイン] を選択します。

  4. [テーブル デザイナー] メニューの [インデックス/キー]をクリックします。

  5. 指定したい具体的な塗りつぶし係数を持つインデックスを選択します。

  6. [ Fill Specification]\(塗りつぶしの指定\) を展開し、[ Fill Factor]\(塗りつぶし係数\) 行を選択し、行に必要な塗りつぶし係数を入力します。

  7. をクリックしてを閉じます。

  8. [ファイル] メニューの table_nameを保存]を選びます。

オブジェクト エクスプローラーを使用してインデックスの塗りつぶし係数を指定するには

  1. オブジェクト エクスプローラーで、プラス記号をクリックして、インデックスの塗りつぶし係数を指定するテーブルを含むデータベースを展開します。

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。

  3. プラス記号をクリックして、インデックスの塗りつぶし係数を指定するテーブルを展開します。

  4. プラス記号をクリックして [インデックス] フォルダーを展開します。

  5. 指定する塗りつぶし係数を持つインデックスを右クリックし、[ プロパティ] を選択します。

  6. [ ページの選択] で [ オプション] を選択します。

  7. [ 塗りつぶし係数 ] 行に、目的の塗りつぶし係数を入力します。

  8. OK をクリックします。

Transact-SQL の使用

既存のインデックスの塗りつぶし係数を指定するには

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。 この例では、既存のインデックスを再構築し、再構築操作中に指定したフィル ファクターを適用します。

    USE AdventureWorks2012;  
    GO  
    -- Rebuilds the IX_Employee_OrganizationLevel_OrganizationNode index   
    -- with a fill factor of 80 on the HumanResources.Employee table.  
    
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    REBUILD WITH (FILLFACTOR = 80);   
    GO  
    

インデックスの塗りつぶし係数を指定するもう 1 つの方法

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

    USE AdventureWorks2012;  
    GO  
    /* Drops and re-creates the IX_Employee_OrganizationLevel_OrganizationNode index on the HumanResources.Employee table with a fill factor of 80.  
    */  
    
    CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
       (OrganizationLevel, OrganizationNode)   
    WITH (DROP_EXISTING = ON, FILLFACTOR = 80);   
    GO  
    

詳細については、「ALTER INDEX (Transact-SQL)」を参照してください。