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

14

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

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

DForck42
источник

Ответы:

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