Поведение данных в индексах на основе коэффициента заполнения


14

Допустим, у вас есть база данных, в которой коэффициент заполнения по умолчанию равен 20. При вставке данных создаются только страницы, заполненные до 20%?

Насколько я понимаю, когда данные будут вставлены, на страницах будет примерно 20% данных. Однако когда данные обновляются, они расширяются до более чем 20% индекса, вплоть до его заполнения и создания разбиения страницы, верно?

Ответы:


16

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

Когда есть команда DML для данных ( INSERT, UPDATEи / или DELETE), это произойдет с соответствующими затронутыми индексами. Другими словами, если у вас есть страница, заполненная на 20%, и вы вставляете данные на эту страницу, страница будет содержать более 20% данных (скажем, 35% только для примера). Сделайте еще одну вставку, теперь страница заполнена на 64%. Перестройте индекс, и теперь на страницах конечного уровня будет содержаться относительный процент пространства, который вы укажете (или неявно значение по умолчанию для сервера).

( Обратите внимание , что если вы не укажете, PAD_INDEXчтобы быть ON, коэффициент заполнения применяется только к страницам конечного уровня. Но когда вы установите PAD_INDEX = ON, коэффициент заполнения будет учитываться для страниц индекса промежуточного уровня. По умолчанию этоOFF )

Причина для настройки коэффициента заполнения (вместо использования значения по умолчанию 100/0) такова, что вы минимизируете разбиение страницы при вставке или обновлении данных. Но имейте в виду, ничего не бесплатно. Чем ниже коэффициент заполнения, тем больше места обычно занимают данные. Если вы сохраняете 80% свободного пространства страниц для своих индексов, они будут занимать относительно больший объем дискового пространства, что может привести к большему количеству операций чтения.

Насколько я понимаю, когда данные будут вставлены, на страницах будет примерно 20% данных. Однако когда данные обновляются, они расширяются до более чем 20% индекса, вплоть до его заполнения и создания разбиения страницы, верно?

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

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

Приемлемой причиной снижения коэффициента заполнения было бы сведение к минимуму разбиений страниц, что сводит к минимуму фрагментацию индекса страницы


3
Это также минимизирует операции ввода-вывода, необходимые для увеличения или выделения пространства.
JNK

Итак, я был не прав с тем, как работает поведение. Спасибо за такой подробный ответ!
DForck42

1
@ DForck42 Нет проблем, рад помочь.
Томас Стрингер

Можно ли суммировать это, чтобы сказать, что установка низкого коэффициента заполнения будет иметь тенденцию к медленному чтению (больше страниц), но к скорости вставки (меньше разбиений)?
Джон на все руки

2
@Jon: С высоким коэффициентом заполнения заполняет индексы и замедляет чтение. Для каждого индекса есть оптимальный коэффициент заполнения - над ним и под ним медленная запись и чтение. Оптимальность зависит от моделей использования (сколько вставок в день), схем обслуживания (как часто его перестраивают), данных (насколько уникальным является ключ). Неуникальные индексы, как правило, требуют больше свободного места (более низкий коэффициент заполнения).
wqw
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.