Оценка размера кластеризованного индекса

Для оценки места, необходимого для хранения данных в кластеризованном индексе, можно использовать следующие шаги:

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

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

  3. Сложите полученные значения.

Шаг 1. Подсчет места на диске, используемого для хранения данных на конечном уровне

  1. Укажите количество строк в новой таблице:

    Num_Rows = число строк в таблице

  2. Укажите количество столбцов с фиксированной и изменяемой длиной, а также рассчитайте необходимый размер места для их хранения.

    Вычислите размер, занимаемый каждой из этих групп столбцов в строке данных. Размер столбца зависит от типа данных и длины. Дополнительные сведения см. в разделе Типы данных (компонент Database Engine).

    Num_Cols = общее число столбцов (фиксированной и переменной длины)

    Fixed_Data_Size = общий размер в байтах всех столбцов фиксированной длины

    Num_Variable_Cols = число столбцов переменной длины

    Max_Var_Size = максимальный размер в байтах всех столбцов переменной длины

  3. Если кластеризованный индекс не является уникальным, учитывается столбец uniquifier:

    Столбец uniquifier может принимать значение NULL и имеет переменную длину. Он будет иметь значение, отличное от NULL, и размер 4 байта для строк, имеющих неуникальные значения ключа. Это значение является частью ключа индекса и требует уникальности значения ключа во всех строках.

    Num_Cols = Num_Cols + 1

    Num_Variable_Cols = Num_Variable_Cols + 1

    Max_Var_Size = Max_Var_Size + 4

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

  4. Часть строки, называемая битовой картой NULL, зарезервирована для управления свойством столбца принимать значение NULL. Вычислите ее размер:

    Null_Bitmap = 2 + ((Num_Cols + 7) / 8)

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

  5. Расчет размера данных с переменной длиной:

    Если таблица содержит столбцы с переменной длиной, определите, сколько пространства потребуется для хранения столбцов в строке:

Variable_Data_Size* = 2 + (Num_Variable_Cols x 2) + *Max_Var_Size

Байты, добавляемые к ***Max_Var_Size***, нужны для отслеживания каждого столбца переменных. Эта формула исходит из предположения, что все столбцы переменной длины заполнены на 100 %. Если предполагается, что будет использовано меньше места для хранения столбца изменяемой длины, можно изменить значение ***Max_Var_Size*** в процентах от общей изменяемой длины для более точного подсчета общего размера таблицы.

<div class="alert">

<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/Bb677181.alert_note(ru-ru,SQL.105).gif" title="Примечание" alt="Примечание" class="note" /><strong>Примечание</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Можно сочетать столбцы varchar, nvarchar, varbinary или sql_variant, в результате чего общая ширина определенной таблицы превысит 8060 байт. Длина каждого из этих столбцов должна быть в пределах 8 000 байт для столбцов типа varchar, varbinary или sql_variant и 4 000 байт для столбцов типа nvarchar. Тем не менее их общая ширина в таблице может превышать предел в 8 060 байт. Дополнительные сведения см. в разделе <a href="ms186981(v=sql.105).md">Превышающие размер страницы данные строки, превышающие 8 КБ</a>.</p></td>
</tr>
</tbody>
</table>

</div>

Если в таблице нет столбцов переменной ширины, присвойте параметру ***Variable_Data_Size*** значение 0.
  1. Вычислите общий размер строк:

    Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

    Значение 4 является размером заголовка строки.

  2. Расчет количества строк на странице (8 096 свободных байт на страницу):

    Rows_Per_Page = 8096 / (Row_Size + 2)

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

  3. Расчет количества зарезервированных пустых строк на странице на основании указанного коэффициента заполнения:

    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Row_Size + 2)

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

  4. Расчет количества страниц, необходимого для хранения всех строк:

    Num_Leaf_Pages = Num_Rows / (Rows_Per_Page - Free_Rows_Per_Page)

    Рассчитанное количество страниц необходимо округлить в большую сторону до ближайшего целого числа.

  5. Расчет количества места, необходимого для хранения данных на конечном уровне (всего 8 192 байт на страницу):

Leaf_space_used* = 8192 x *Num_Leaf_Pages

Шаг 2. Расчет места на диске, используемого для хранения информации индекса

Для оценки места, необходимого для хранения верхних уровней индекса, можно использовать следующие шаги:

  1. Укажите количество столбцов переменной и фиксированной длины в ключе индекса и рассчитайте объем необходимого места для их хранения:

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

    Num_Key_Cols = общее число ключевых столбцов (фиксированной и переменной длины)

    Fixed_Key_Size = общий размер в байтах всех ключевых столбцов фиксированной длины

    Num_Variable_Key_Cols = количество ключевых столбцов переменной длины

    Max_Var_Key_Size = максимальный размер в байтах всех ключевых столбцов переменной длины

  2. Если индекс является неуникальным, необходимо учитывать любой столбец uniquifier:

    Столбец uniquifier может принимать значение NULL и имеет переменную длину. Он будет иметь значение, отличное от NULL, и размер 4 байта для строк, имеющих неуникальные значения ключа индекса. Это значение является частью ключа индекса и требует уникальности значения ключа во всех строках.

    Num_Key_Cols = Num_Key_Cols + 1

    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1

    Max_Var_Key_Size = Max_Var_Key_Size + 4

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

  3. Расчет размера битовой карты NULL:

    Если в ключе индекса существуют столбцы, допускающие значение NULL, то часть индексной строки резервируется для битовой карты NULL. Вычислим ее размер:

    Index_Null_Bitmap = 2 + ((число столбцов в строке индекса + 7) / 8)

    Следует использовать только целую часть предшествующего выражения. Остаток должен быть отброшен.

    Если ключевые столбцы не могут принимать значение NULL, установите параметр Index_Null_Bitmap равным 0.

  4. Расчет размера данных с переменной длиной:

    Если индекс содержит столбцы с переменной длиной, определим, сколько пространства потребуется для хранения этих столбцов в строке:

Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size

Байты, добавляемые к ***Max_Var_Key_Size***, нужны для отслеживания каждого столбца переменной длины. Эта формула исходит из предположения, что все столбцы переменной длины заполнены на 100 %. Если предполагается, что для хранения столбца переменной длины будет использовано меньше места, то для более точного подсчета общего размера таблицы можно задать значение ***Макс_объем_перем_ключей*** как процент от максимально возможной длины.

Если нет столбцов переменной ширины, установите значение ***Variable_Key_Size*** равным 0.
  1. Расчет размера индексной строки:

    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (для служебных данных строки заголовка индекса) + 6 (для указателя на идентификатор дочерней страницы)

  2. Расчет количества индексных строк на страницу (8 096 свободных байт на страницу):

    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

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

  3. Расчет количества уровней в индексе.

    Non-leaf_Levels = 1 + log Index_Rows_Per_Page (Num_Leaf_Pages / Index_Rows_Per_Page)

    Данное значение округляется в большую сторону до ближайшего целого числа. Это значение не учитывает конечный уровень кластеризованного индекса.

  4. Вычислите количество неконечных страниц индекса:

Num_Index_Pages =∑Level (Num_Leaf_Pages / (Index_Rows_Per_PageУровень))

где 1 \<= Уровень \<= ***Non-leaf_Levels***

Округлите каждое слагаемое в большую сторону до ближайшего целого числа. Рассмотрим в качестве простого примера индекс, где ***Num_Leaf_Pages*** = 1000 и ***Index_Rows_Per_Page*** = 25. Первый уровень индекса над конечным уровнем содержит 1000 строк индекса, что составляет одну строку индекса на конечную страницу, а на одну страницу помещается 25 строк индекса. Это означает, что для хранения этих 1000 строк индекса требуется 40 страниц. Следующий уровень индекса должен хранить 40 строк. Это означает, что ему необходимо 2 страниц. Последний уровень индекса должен хранить 2 строки. Это означает, что ему необходима 1 страница. Это дает 43 неконечных страницы индекса. Использование этих значений в предыдущих формулах приводит к следующему результату:

***Non-leaf_Levels*** = 1 + log25 (1000 / 25) = 3

***Num_Index_Pages*** = 1000/(253)+ 1000/(252) + 1000/(251) = 1 + 2 + 40 = 43, что составит число страниц, описанное в примере.
  1. Расчет размера индекса (всего 8 192 байт на страницу).

Index_Space_Used* = 8192 x *Num_Index_Pages

Шаг 3. Сложение полученных значений

Необходимо сложить результаты, полученные на двух предыдущих шагах:

Размер кластеризованного индекса (в байтах) = Leaf_Space_Used + Index_Space_used

Этот расчет не учитывает следующие факторы.

  • Секционирование

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

  • Страницы размещения

    Предусмотрена по меньшей мере одна IAM-страница, используемая для отслеживания страниц, выделенных куче, но размер служебных данных минимален, и алгоритма точного детерминированного вычисления количества используемых IAM-страниц не существует.

  • Значения LOB

    Алгоритм точного определения места, используемого для хранения значений данных типа LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml и image сложен. Достаточно только добавить средний размер ожидаемого значения LOB, умножить на Число_строк и добавить полученное значение к общему размеру кластеризованного индекса.

  • Сжатие

    Размер сжатого индекса нельзя вычислить заранее.

  • Разреженные столбцы

    Сведения о требованиях к месту на диске для разреженных столбцов см. в разделе Использование разреженных столбцов.