Укажите коэффициент заполнения для индексаSpecify Fill Factor for an Index

ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server 2016 и более поздние версии База данных SQL Azure Azure Synapse Analytics Parallel Data Warehouse

В этом разделе приведено описание коэффициента заполнения и описываются способы указания значения коэффициента заполнения в индексе в SQL ServerSQL Server с помощью SQL Server Management StudioSQL Server Management Studio или Transact-SQLTransact-SQL.This topic describes what fill factor is and how to specify a fill factor value on an index in SQL ServerSQL Server 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. При создании или перестроении индекса коэффициент заполнения отображает процент заполнения пространства каждой страницы конечного уровня, что позволяет зарезервировать для будущего расширения оставшееся на каждой странице пространство как свободное.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. Например, при указании для коэффициента заполнения значения 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.

Коэффициент заполнения — это значение в процентах от 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.

Примечание

Значения коэффициента заполнения 0 и 100 равнозначны.Fill-factor values 0 and 100 are the same in all respects.

В этом разделеIn This Topic

Перед началомBefore You Begin

Вопросы производительностиPerformance Considerations

Разбиения страницPage Splits

Правильный выбор значения коэффициента заполнения уменьшает потенциальное разделение страниц, предоставляя достаточно места для увеличения индекса при добавлении данных в базовую таблицу. При добавлении новой строки на страницу, которая используется в полнотекстовом индексировании, компонент Компонент Database EngineDatabase 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 EngineDatabase 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. Также указанная операция может вызвать фрагментацию, что приводит к увеличению количества операций ввода-вывода.Also, it can cause fragmentation that causes increased I/O operations. Для предотвращения слишком частого разбиения страниц необходимо перераспределить данные, перестроив индекс с помощью нового или уже существующего коэффициента заполнения.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.

Хотя низкое значение коэффициента заполнения (отличное от 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. Поэтому при задании значения коэффициента заполнения, отличного от значения по умолчанию, производительность операций считывания снижается обратно пропорционально значению коэффициента заполнения.Therefore, specifying a fill factor other than the default can decrease database read performance by an amount inversely proportional to the fill-factor setting. Например, значение коэффициента заполнения, равное 50, может снизить производительность операций чтения в два раза.For example, a fill-factor value of 50 can cause database read performance to decrease by two times. Производительность операций чтения снижается из-за того, что в индексе содержится большее количество страниц, что увеличивает количество операций ввода-вывода, проводимых для извлечения данных.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, может повысить производительность, если новые данные равномерно распределяются по таблице.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. Если существующие строки будут обновляться данными, увеличивающими размер строк, следует использовать коэффициент заполнения менее 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

PermissionsPermissions

Необходимо разрешение 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 StudioUsing SQL Server Management Studio

Задание коэффициента заполнения с помощью конструктора таблицTo specify a fill factor by using Table Designer

  1. В обозревателе объектов щелкните значок плюса, чтобы развернуть базу данных, содержащую таблицу, в которой необходимо указать коэффициент заполнения индекса.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. Щелкните правой кнопкой мыши таблицу, для которой необходимо указать коэффициент заполнения индекса, а затем выберите пункт Конструктор.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. Выберите индекс с коэффициентом заполнения, который необходимо указать.Select the index with the fill factor that you want to specify.

  6. Разверните Характеристики заполнения, выберите строку Коэффициент заполнения и введите в строке необходимый коэффициент заполнения.Expand Fill Specification, select the Fill Factor row and enter the fill factor you want in the row.

  7. Щелкните Закрыть.Click Close.

  8. В меню Файл выберите пункт Сохранитьимя_таблицы.On the File menu, select Savetable_name.

Указание коэффициента заполнения для индекса с помощью обозревателя объектов:To specify a fill factor in an index by using Object Explorer

  1. В обозревателе объектов щелкните значок плюса, чтобы развернуть базу данных, содержащую таблицу, в которой необходимо указать коэффициент заполнения индекса.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. Щелкните знак плюса (+), чтобы развернуть таблицу, для которой необходимо указать коэффициент заполнения индекса.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. Щелкните правой кнопкой мыши индекс с коэффициентом заполнения, который нужно указать, и выберите пункт Свойства.Right-click the index with the fill factor that you want to specify and select Properties.

  6. В разделе Выбор страницы щелкните Параметры.Under Select a page, select Options.

  7. В строке Коэффициент заполнения введите нужный коэффициент заполнения.In the Fill factor row, enter the fill factor that you want.

  8. Нажмите кнопку ОК.Click OK.

Использование Transact-SQLUsing Transact-SQL

Указание коэффициента заполнения для существующего индексаTo specify a fill factor in an existing index

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент Database EngineDatabase Engine.In Object Explorer, connect to an instance of Компонент Database EngineDatabase Engine.

  2. На стандартной панели выберите пункт Создать запрос.On the Standard bar, click New Query.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.Copy and paste the following example into the query window and click Execute. В примере перестраивается существующий индекс и применяется коэффициент заполнения во время операции перестроения.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  
    

Другой способ указания коэффициента заполнения в индексеAnother way to specify a fill factor in an index

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент Database EngineDatabase Engine.In Object Explorer, connect to an instance of Компонент Database EngineDatabase 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).