インデックスの FILL FACTOR の指定Specify Fill Factor for an Index

このトピックの対象: ○SQL Server (2016 以降)○Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、FILL FACTOR について説明すると共に、 SQL Server 2017SQL Server 2017 または SQL Server Management StudioSQL Server Management Studio を使用して Transact-SQLTransact-SQLのインデックスの FILL FACTOR 値を指定する方法について説明します。This topic describes what fill factor is and how to specify a fill factor value on an index in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

FILL FACTOR オプションは、インデックス データ ストレージとパフォーマンスの微調整を行うために用意されています。The fill-factor option is provided for fine-tuning index data storage and performance. インデックスの作成または再構築を行うとき、各リーフ レベルのページのデータを格納する領域の割合が FILL FACTOR 値によって決まり、今後インデックスのサイズが大きくなる場合に備えて指定した各ページ上の残りの空き領域が予約されます。When an index is created or rebuilt, the fill-factor value determines the percentage of space on each leaf-level page to be filled with data, reserving the remainder on each page as free space for future growth. たとえば、FILL FACTOR 値を 80 に指定すると、基になるテーブルにデータを追加したときにインデックスのサイズを拡張するための領域として、各リーフ レベルのページの 20% が空き領域として確保されます。For example, specifying a fill-factor value of 80 means that 20 percent of each leaf-level page will be left empty, providing space for index expansion as data is added to the underlying table. 空き領域は、インデックスの最後ではなく、インデックス行の間に確保されます。The empty space is reserved between the index rows rather than at the end of the index.

有効な FILL FACTOR 値は 1 ~ 100 (パーセント) です。サーバー全体の既定値は 0 で、これはリーフ レベルのページの全容量が使用されることを意味します。The fill-factor value is a percentage from 1 to 100, and the server-wide default is 0 which means that the leaf-level pages are filled to capacity.

注意

FILL FACTOR 値 0 と 100 の機能は、まったく同じです。Fill-factor values 0 and 100 are the same in all respects.

このトピックの内容In This Topic

はじめに Before You Begin

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

ページ分割Page Splits

適切な FILL FACTOR 値を選択すると、基になるテーブルにデータが追加されたときにインデックスのサイズを拡張するのに十分な領域が確保され、ページ分割が実行される可能性が低くなります。フル インデックス ページに新しい行を追加すると、新しい行を挿入する領域を確保するために、 データベース エンジンDatabase Engine により行の約半分が新しいページに移動されます。A correctly chosen fill-factor value can reduce potential page splits by providing enough space for index expansion as data is added to the underlying table.When a new row is added to a full index page, the データベース エンジンDatabase Engine moves approximately half the rows to a new page to make room for the new row. この再構成をページ分割といいます。This reorganization is known as a page split. ページ分割により新しいレコード用の領域が確保されますが、この操作の実行には時間がかかることがあります。また、ページ分割はリソースを集中的に消費する操作です。A page split makes room for new records, but can take time to perform and is a resource intensive operation. さらに、I/O 操作を増加させる断片化の原因となることもあります。Also, it can cause fragmentation that causes increased I/O operations. ページ分割が頻繁に行われる場合は、新規または既存の FILL FACTOR 値を使用してデータを再配布して、インデックスを再構築できます。When frequent page splits occur, the index can be rebuilt by using a new or existing fill-factor value to redistribute the data. 詳細については、「 インデックスの再編成と再構築」を参照してください。For more information, see Reorganize and Rebuild Indexes.

FILL FACTOR 値を 0 以外の小さな値に設定すると、インデックスのサイズが大きくなったときにページを分割する必要性を減少させることができますが、さらに多くの保存領域が必要になり、読み取りのパフォーマンスが低下する場合があります。Although a low, nonzero fill-factor value may reduce the requirement to split pages as the index grows, the index will require more storage space and can decrease read performance. 挿入や更新が頻繁に実行されるアプリケーションでも、データベース読み取り回数はデータベース書き込み回数よりも 5 ~ 10 倍多くなるのが普通です。Even for an application oriented for many insert and update operations, the number of database reads typically outnumber database writes by a factor of 5 to 10. したがって、既定値以外の FILL FACTOR 値を指定すると、FILL FACTOR の設定に反比例してデータベース読み取りのパフォーマンスが低下する可能性があります。Therefore, specifying a fill factor other than the default can decrease database read performance by an amount inversely proportional to the fill-factor setting. たとえば、FILL FACTOR 値を 50 に指定すると、データベース読み取りのパフォーマンスが 1/2 に低下することがあります。For example, a fill-factor value of 50 can cause database read performance to decrease by two times. インデックスに多くのページが含まれていて、データを取得するには、ディスク I/O 操作を増加させる必要があるため、読み取りのパフォーマンスが低下します。Read performance is decreased because the index contains more pages, therefore increasing the disk IO operations required to retrieve the data.

テーブルの最後へのデータの追加Adding Data to the End of the Table

新しいデータがテーブル全体に均等に分散される場合は、0 および 100 以外の FILL FACTOR を指定するとパフォーマンスが向上する可能性があります。A nonzero fill factor other than 0 or 100 can be good for performance if the new data is evenly distributed throughout the table. ただし、すべてのデータがテーブルの最後に追加されると、インデックス ページ内の空き領域は埋められません。However, if all the data is added to the end of the table, the empty space in the index pages will not be filled. たとえば、インデックス キー列が IDENTITY 列であると、新しい行のキーが常に増加し、インデックス行はインデックスの最後に論理的に追加されます。For example, if the index key column is an IDENTITY column, the key for new rows is always increasing and the index rows are logically added to the end of the index. 行のサイズを大きくするデータで既存の行が更新される場合は、FILL FACTOR 値を 100 未満にしてください。If existing rows will be updated with data that lengthens the size of the rows, use a fill factor of less than 100. 各ページ上の追加のバイトにより、行の追加の長さによって発生するページ分割を最小限にすることができます。The extra bytes on each page will help to minimize page splits caused by extra length in the rows.

セキュリティ Security

アクセス許可 Permissions

テーブルまたはビューに対する ALTER 権限が必要です。Requires ALTER permission on the table or view. 実行するには、 sysadmin 固定サーバー ロール、または db_ddladmin 固定データベース ロールおよび db_owner 固定データベース ロールのメンバーである必要があります。User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

SQL Server Management Studio の使用 Using SQL Server Management Studio

テーブル デザイナーを使用して FILL FACTOR を指定するにはTo specify a fill factor by using Table Designer

  1. オブジェクト エクスプローラーで、インデックスの FILL FACTOR を指定するテーブルが格納されているデータベースをプラス記号をクリックして展開します。In Object Explorer, click the plus sign to expand the database that contains the table on which you want to specify an index’s fill factor.

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。Click the plus sign to expand the Tables folder.

  3. インデックスの FILL FACTOR を指定するテーブルを右クリックし、 [デザイン]を選択します。Right-click the table on which you want to specify an index’s fill factor and select Design.

  4. [テーブル デザイナー] メニューの [インデックス/キー]をクリックします。On the Table Designer menu, click Indexes/Keys.

  5. FILL FACTOR を指定するインデックスを選択します。Select the index with the fill factor that you want to specify.

  6. [FILL の指定]を展開し、 [FILL FACTOR] 行を選択し、目的の FILL FACTOR を行に入力します。Expand Fill Specification, select the Fill Factor row and enter the fill factor you want in the row.

  7. [閉じる]をクリックします。Click Close.

  8. ファイル メニューの table_nameを保存を選びます。On the File menu, select Savetable_name.

オブジェクト エクスプローラーを使用してインデックスの FILL FACTOR を指定するにはTo specify a fill factor in an index by using Object Explorer

  1. オブジェクト エクスプローラーで、インデックスの FILL FACTOR を指定するテーブルが格納されているデータベースをプラス記号をクリックして展開します。In Object Explorer, click the plus sign to expand the database that contains the table on which you want to specify an index’s fill factor.

  2. プラス記号をクリックして [テーブル] フォルダーを展開します。Click the plus sign to expand the Tables folder.

  3. プラス記号をクリックして、インデックスの FILL FACTOR を指定するテーブルを展開します。Click the plus sign to expand the table on which you want to specify an index’s fill factor.

  4. プラス記号をクリックして [インデックス] フォルダーを展開します。Click the plus sign to expand the Indexes folder.

  5. FILL FACTOR を指定するインデックスを右クリックし、 [プロパティ]を選択します。Right-click the index with the fill factor that you want to specify and select Properties.

  6. [ページの選択][オプション]を選択します。Under Select a page, select Options.

  7. [FILL FACTOR] 行に、目的の FILL FACTOR を入力します。In the Fill factor row, enter the fill factor that you want.

  8. クリックして OKです。Click OK.

Transact-SQL の使用 Using Transact-SQL

既存のインデックスの FILL FACTOR を指定するにはTo specify a fill factor in an existing index

  1. オブジェクト エクスプローラーで、 データベース エンジンDatabase Engineのインスタンスに接続します。In Object Explorer, connect to an instance of データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ]をクリックします。On the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行]をクリックします。Copy and paste the following example into the query window and click Execute. この例では、既存のインデックスを再構築し、再構築処理中に指定された FILL FACTOR を適用します。The example rebuilds an existing index and applies the specified fill factor during the rebuild operation.

    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  
    

別の方法でインデックスの FILL FACTOR を指定するAnother way to specify a fill factor in an index

  1. オブジェクト エクスプローラーで、 データベース エンジンDatabase Engineのインスタンスに接続します。In Object Explorer, connect to an instance of データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ]をクリックします。On the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行]をクリックします。Copy and paste the following example into the query window and click Execute.

    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)」を参照してください。For more information, see ALTER INDEX (Transact-SQL).