Коэффициент заполнения

Коэффициент заполнения (параметр fill factor) служит для точной настройки хранения и производительности индекса. При создании или перестроении индекса коэффициент заполнения отображает процент заполнения пространства каждой страницы конечного уровня, что позволяет зарезервировать пространство, необходимое для будущего расширения. Например, при указании для коэффициента заполнения значения 80 на каждой странице конечного уровня будет зарезервировано 20 процентов занимаемого ею дискового пространства. Данное дисковое пространство будет использовано для расширения индекса при добавлении в базовую таблицу новых данных. Пустое место резервируется не в конце страницы, а между строками индекса каждой страницы.

Коэффициент заполнения может принимать значение от 1 до 100. В большинстве случаев рекомендуется принимать значение по умолчанию, равное 0. Когда коэффициент заполнения имеет значение 0, конечный уровень полностью заполнен.

ms177459.note(ru-ru,SQL.90).gifПримечание.
Значения коэффициента заполнения 0 и 100 равнозначны.

Для задания разных значений коэффициента заполнения для разных индексов используйте инструкции CREATE INDEX и ALTER INDEX. Изменить значение по умолчанию для всего сервера можно с помощью хранимой системной процедуры sp_configure. Для просмотра значений коэффициента заполнения для одного или нескольких индексов используйте представление каталога sys.indexes.

ms177459.note(ru-ru,SQL.90).gifВажно!
Изменение коэффициента заполнения возможно только при создании и перестроении индекса. SQL Server 2005 Database Engine не сохраняет динамически указанный в процентах объем свободного пространства на страницах. Попытка выделения дополнительного дискового пространства для страниц данных приводит к неэффективному применению коэффициента заполнения, так как при добавлении данных на страницу компонент Database Engine выполняет разбиение ее свободного пространства согласно заданному значению коэффициента заполнения.

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

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

Разумный выбор значения коэффициента заполнения уменьшает количество операций разбиения страниц, при этом добавление данных в базовую таблицу происходит за счет выделения дополнительного пространства для расширения индекса.

При добавлении новой строки на полностью заполненную страницу компонент Database Engine перемещает половину имеющихся на ней данных на новую страницу, таким образом освобождая пространство для новой строки. Такая реорганизация называется разбиением страницы. Операция разбиения страницы позволяет выделить пространство для размещения новых записей, однако является ресурсоемкой и может выполняться длительное время. Также указанная операция может вызвать фрагментацию, что приводит к увеличению количества операций ввода-вывода. Для предотвращения слишком частого разбиения страниц необходимо перераспределить данные, перестроив индекс с помощью нового или уже существующего коэффициента заполнения. Дополнительные сведения см. в разделе Реорганизация и перестроение индексов.

Хотя низкое значение коэффициента заполнения (отличное от 0) может снизить необходимость в разбиении страниц при расширении индекса, для его хранения требуется больший объем памяти, что приводит к снижению производительности. Даже для приложений, ориентированных на выполнение множества операций вставки и обновления, количество операций считывания обычно в 5 — 10 раз превышает количество операций записи. Поэтому при задании значения коэффициента заполнения, отличного от значения по умолчанию, производительность операций считывания снижается обратно пропорционально значению коэффициента заполнения. Например, значение коэффициента заполнения, равное 50, может снизить производительность операций чтения в два раза. Производительность операций чтения снижается из-за того, что в индексе содержится большее количество страниц, что увеличивает количество операций ввода-вывода, проводимых для извлечения данных.

Добавление данных в конец таблицы

Ненулевой коэффициент заполнения может быть полезен для производительности, если новые данные равномерно распределяются по таблице. Однако, если данные добавляются в конец таблицы, пустое место заполняться не будет. Например, если ключевым столбцом индекса является столбец IDENTITY, ключ для новых строк будет постоянно увеличиваться и строки будут логически добавляться в конец таблицы. В этом случае разбиение страницы не приведет к снижению производительности. Можно использовать коэффициент заполнения по умолчанию, равный нулю, или указать коэффициент заполнения 100, чтобы заполнялся конечный уровень.

См. также

Основные понятия

Создание индексов (компонент Database Engine)
Параметр fill factor

Другие ресурсы

ALTER INDEX (Transact-SQL)
CREATE INDEX (Transact-SQL)
sys.indexes (Transact-SQL)
Хранимая процедура sp_configure (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005