Как физически распределяется коэффициент заполнения?

Я просматривал книги в Интернете и заклинания Google, пытаясь выяснить, какой физический коэффициент заполнения присутствует на листовой странице (SQL Server 2000 и 2005).

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

Например, [просто для простоты], предположим, что страница может содержать только 100 строк. Если коэффициент заполнения установлен равным 75%, означает ли это, что первая (или последняя) 75% страницы - это данные, а остальная часть свободна или свободна каждая четвертая строка (т. Е. Страница выглядит так: данные, данные, данные, бесплатно, данные, данные, данные, бесплатно, ...).

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

Если кто-то знает ссылку на MSDN, укажите мне, пожалуйста! Я не могу найти один в данный момент (все еще ища все же). Из того, что я прочитал, подразумевается, что в нем много пробелов, но это явно не указано.

2 ответа

Решение

От MSDN:

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

и далее:

Когда новая строка добавляется на страницу полного индекса,Database Engine перемещает примерно половину строк на новую страницу, чтобы освободить место для новой строки. Эта реорганизация называется разделением страниц. Разделение страниц создает пространство для новых записей, но может потребовать времени для выполнения и является ресурсоемкой операцией. Кроме того, это может привести к фрагментации, которая вызывает увеличениеI/Oоперации. Когда происходят частые разбиения страницы, индекс можно перестроить, используя новое или существующее значение коэффициента заполнения для перераспределения данных.

SQL ServerСтраница данных состоит из следующих элементов:

  • Page header:96байты исправлены.
  • Data: переменная
  • Row offset arrayпеременная

Массив смещения строк всегда сохраняется вконце страницы и увеличивается в обратном направлении.

Каждый элемент массива является2-байтовое значение, содержащее смещение к началу каждой строки на странице.

Строки не упорядочены на странице данных: вместо этого их порядок (в случае кластерного хранилища) определяется массивом смещения строк. Это смещения строк, которые сортируются.

Скажем, если мы вставим100-байтовая строка со значением ключа кластера10в кластеризованную таблицу и она попадает на свободную страницу, она вставляется следующим образом:

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 8190 ]   Free space
[8190 - 8191 ]   Row offset array: [96]

Затем мы вставляем новую строку в ту же страницу, на этот раз со значением ключа кластера9:

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 295  ]   Row 9
[296  - 8188 ]   Free space
[8188 - 8191 ]   Row offset array: [196] [96]

Строка логически добавлена, но добавлена физически.

Массив смещения переупорядочен, чтобы отразить логический порядок строк.

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

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

Поскольку наименьшее количество данных, которое может быть извлечено SQL Server в одном считывании ввода-вывода, представляет собой одну полную страницу данных, зачем вообще нужно сортировать какие-либо строки в пределах одной страницы? Могу поспорить, что это не так, так что, даже если в конце все пропуски находятся в одном большом пропуске, новые записи могут быть добавлены в конце независимо от того, правильный ли это порядок сортировки. (если нет причин сортировать записи на странице в первую очередь)

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

Другие вопросы по тегам