2009-09-02 4 views
4

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

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

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

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

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

ответ

2

от MSDN:

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

и, кроме того:

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

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

  • Page header: 96 байт, фиксируется.
  • Data: переменная
  • Row offset array: переменная.

Строка смещения массива всегда хранятся в конце страницы и растет назад.

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

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

Скажем, если вставить 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] 

строка предваряется логически, но Appen ded физически.

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

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

+0

Да, я видел это, но это не говорит о том, как изначально распределяется фактор заполнения. –

+0

@Quassnoi, я думаю, он спрашивает, как все будет происходить, когда новая строка будет «вставлена» на пустое место на странице. Будут ли разрывы разбросаны повсюду или все в конце физической страницы (он думает) повлияет на производительность вставки ... –

+0

@Charles - «думает» немного силен :-) Я читаю конфликтующие блоги, о которых говорят некоторые люди, другие говорят, что этого не произойдет. Я просто пытаюсь получить более глубокое понимание того, что происходит ... –

0

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

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

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