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

Изменения: 15 сентября 2007 г.

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

  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_Bitmap = 2 + ((Num_Cols + 7) / 8)
    Используется только целая часть предыдущего выражения, остальная часть отбрасывается.
  5. Расчет размера данных с переменной длиной:
    Если таблица содержит столбцы с переменной длиной, определите, сколько пространства потребуется для хранения столбцов в строке:
    Variable_Data_Size* = 2 + (число_перем_столбцов x 2) + *макс_объем_перем_столбцов Формула исходит из предположения, что все столбцы переменной длины заполнены на 100%. Если предполагается, что будет использовано меньше места для хранения столбца изменяемой длины, можно изменить значение Max_Var_Size в процентах от общей изменяемой длины для более точного подсчета общего размера таблицы.
    ms178085.note(ru-ru,SQL.90).gifПримечание.
    SQL Server 2005 вводит возможность совмещать столбцы varchar, nvarchar, varbinary или sql_variant, что приводит к превышению установленной ширины таблицы в 8 060 байт. Длина каждого из этих столбцов должна быть в пределах 8 000 байт для varchar, varbinary, или sql_variant столбца или 4 000 байт для nvarchar столбцов. Тем не менее их общая ширина в таблице может превышать ограничение 8 060 байт. Дополнительные сведения см. в разделе Превышающие размер страницы данные строки, превышающие 8 КБ.
    Если в таблице нет столбцов переменной ширины, присвойте параметру ***Variable\_Data\_Size*** значение 0.
  6. Вычислите общий размер строк:
    Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
    Значение 4 является размером заголовка строки.
  7. Расчет количества строк на странице (8 096 свободных байт на страницу):
    Rows_Per_Page = 8096 / (размер_строки + 2)
    Так как размер строк не приводит к разрыву страниц, общее количество строк на страницу необходимо округлить до меньшего целого значения целой строки. Значение 2 в формуле соответствует записи строки в массиве областей памяти страницы.
  8. Расчет количества зарезервированных пустых строк на странице на основании указанного коэффициента заполнения:
    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Row_Size + 2)
    Коэффициент заполнения, используемый в расчете, должен быть целым значением, а не процентным соотношением. Так как строки не переходят с одной страницы на другую, общее количество строк на страницу необходимо округлить до ближайшего меньшего целого значения. При увеличении коэффициента заполнения на каждой странице будет храниться больше данных, и, соответственно, потребуется меньше страниц. Значение 2 в формуле соответствует записи строки в массиве областей памяти страницы.
  9. Расчет количества страниц, необходимого для хранения всех строк:
    Num_Pages = Num_Rows / (Rows_Per_Page - Free_Rows_Per_Page)
    Количество рассчитанных страниц необходимо округлить в большую сторону до ближайшего целого числа.
  10. Расчет количества места, необходимого для хранения данных на конечном уровне (всего 8 192 байт на страницу):
    Leaf_space_used* = 8192 x *Num_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 + ((число ключевых столбцов, не допускающих значения NULL + 7) / 8)
    Следует использовать только целую часть предшествующего выражения. Остаток должен быть отброшен.
    Если ключевые столбцы не могут принимать значение NULL, установите параметр Битсхема_неопр_индекса равным 0.
  4. Расчет размера данных с переменной длиной:
    Если индекс содержит столбцы с переменной длиной, определим, сколько пространства потребуется для хранения этих столбцов в строке:
    Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size Формула исходит из предположения о том, что все столбцы переменной длины заполнены на 100%. Если предполагается, что будет использовано меньше места для столбца переменной длины, то можно изменить значение Max_Var_Key_Size в процентах для более точного подсчета размера всей таблицы.
    Если в таблице нет столбцов переменной длины, установите параметр Variable_Data_Size в 0.
  5. Рассчитайте размер индексной строки:
    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (для заголовка строки индекса) + 6 (для указателя идентификатора страницы-потомка)
  6. Вычислите количество строк индекса на страницу (8 096 свободных байт на страницу):
    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
    Так как индексная строка не может переходить с одной страницы на другую, общее количество строк на страницу необходимо округлить до ближайшего меньшего целого значения. Значение 2 в формуле соответствует записи строки в массиве областей памяти страницы.
  7. Рассчитайте количество уровней в индексе:
    Уровни = 1 + log Index_Rows_Per_Page (Num_Rows / Index_Rows_Per_Page)
    Данное значение округляется в большую сторону до ближайшего целого числа. Это значение не учитывает конечный уровень кластеризованного индекса.
  8. Расчет количества страниц в индексе.
    Num_Index_Pages =∑уровень (Num_Rows / (Index_Rows_Per_Pageуровень)) где 1 <= Уровень <= Уровни
    В качестве примера рассмотрим индекс, в котором общее количество индексных строк, необходимых на уровне выше конечного, равно 1 000, а количество индексных строк на странице равно 25. Это означает, что для хранения 1 000 строк требуется 40 страниц. Следующий уровень индекса должен хранить 40 строк. Это означает, что ему необходимо 2 страниц. Последний уровень индекса должен хранить 2 строки. Это означает, что ему необходима 1 страница. Использование этих значений в предыдущих формулах приводит к следующему результату:
    Высота = 1 + журнал25 (1000 / 25) = 3
    Num_Index_Pages = (1000/(25)3) + (1000/(25)2) + (1000/(25)1) = 43, то есть число страниц, описанное в примере.
  9. Расчет размера индекса (всего 8 192 байт на страницу).
    Index_Space_Used* = 8192 x *Num_Index_Pages

Шаг 3. Суммирование вычисленных значений

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

Размер кластеризованного индекса (в байтах) = Использ_конц_объем + Использ_объем_индекса

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

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

См. также

Основные понятия

Правила проектирования кластеризованного индекса
Создание индексов (компонент Database Engine)
Правила проектирования некластеризованных индексов
Предполагаемый размер таблицы
Оценка размера некластеризованного индекса
Оценка размера кучи

Другие ресурсы

Оценка размера базы данных

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

15 сентября 2007 г.

Изменения
  • Добавлены сведения об округлении к шагу 2.7.