Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
Azure SQL База данных
Azure SQL Управляемый экземпляр
SQL База данных в Microsoft Fabric
Для оценки места, необходимого для хранения данных в кластеризованном индексе, можно использовать следующие шаги:
- Рассчитайте пространство, используемое для хранения данных на листовом уровне кластеризованного индекса.
- Рассчитайте пространство, используемое для хранения сведений об индексе для кластеризованного индекса.
- Сложите полученные значения.
Шаг 1. Рассчитайте пространство, используемое для хранения данных на листовом уровне
Укажите количество строк, присутствующих в таблице:
- Num_Rows = число строк в таблице.
Укажите количество столбцов с фиксированной и изменяемой длиной, а также рассчитайте необходимый размер места для их хранения.
Вычислите размер, занимаемый каждой из этих групп столбцов в строке данных. Размер столбца зависит от типа данных и длины.
- Num_Cols = общее количество столбцов (фиксированной и переменной ширины).
- Fixed_Data_Size = общий размер в байтах всех столбцов фиксированной длины.
- Num_Variable_Cols = количество столбцов переменной длины.
- Max_Var_Size = максимальный размер в байтах всех столбцов переменной ширины.
Если кластеризованный индекс не уникален, учтите столбец uniqueifier.
Столбец уникализатора может принимать значение NULL и имеет переменную длину. Он не является NULL и имеет размером 4 байта в строках с неуникальными значениями ключей. Это значение является частью ключа индекса и требует уникальности значения ключа во всех строках.
- = Num_ColsNum_Cols + 1
- Num_Variable_Cols = Num_Variable_ColsNum_Variable_Cols + 1
- = Max_Var_SizeMax_Var_Size + 4
В этих изменениях предполагается, что все значения являются неуникающими.
Часть строки, называемая битовой картой null, зарезервирована для управления нулевыми значениями в столбцах. Вычислите ее размер.
- Null_Bitmap = 2 + ((Num_Cols + 7) / 8)
Используется только целая часть предыдущего выражения, остальная часть отбрасывается.
Расчет размера данных с переменной длиной:
Если таблица содержит столбцы с переменной длиной, определите, сколько пространства потребуется для хранения столбцов в строке:
- Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size
Байты, добавляемые к Max_Var_Size, нужны для отслеживания каждого столбца переменных. Эта формула исходит из предположения, что все столбцы переменной длины заполнены на 100 %. Если предполагается, что будет использовано меньше места для хранения столбца изменяемой ширины, можно изменить значение Max_Var_Size в процентах от общей изменяемой ширины для более точного подсчета общего размера таблицы.
Можно сочетать столбцы varchar, nvarchar, varbinaryили sql_variant , в результате чего общая ширина определенной таблицы превысит 8 060 байт. Длина каждого из этих столбцов должна быть в пределах 8 000 байт для столбцов типа varchar, varbinaryили sql_variant и 4 000 байт для столбцов типа nvarchar . Однако их объединенные ширины могут превышать 8060-байтового ограничения в таблице.
Если в таблице нет столбцов переменной ширины, присвойте параметру Variable_Data_Size значение 0.
Вычислите общий размер строк:
- Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
Значение 4 является накладными расходами на заголовок строки данных.
Вычислите количество строк на страницу (8 096 бесплатных байт на страницу):
- Rows_Per_Page = 8096 / (Row_Size + 2)
Так как строки не охватывают страницы, количество строк на страницу должно быть округлено до ближайшей целой строки. Значение 2 в формуле соответствует записи строки в массиве слотов страницы.
Рассчет количества зарезервированных пустых строк на странице на основании указанного коэффициента заполнения :
- Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Row_Size + 2)
Коэффициент заполнения, используемый в расчете, должен быть целым значением, а не процентным соотношением. Так как строки не охватывают страницы, количество строк на страницу должно быть округлено до ближайшей целой строки. По мере роста коэффициента заполнения на каждой странице хранится больше данных и меньше страниц. Значение 2 в формуле соответствует записи строки в массиве слотов страницы.
Вычислите количество страниц, необходимое для хранения всех строк:
Num_Leaf_Pages / (Num_Rows Rows_Per_Page )Free_Rows_Per_Page
Вычисленное количество страниц должно быть округлено в большую сторону до ближайшей целой страницы.
Вычислите объем пространства, необходимого для хранения данных на листвовом уровне (всего 8192 байта на страницу):
- Leaf_space_used = 8192 x Num_Leaf_Pages
Шаг 2. Вычисление пространства, используемого для хранения сведений об индексе
Для оценки места, необходимого для хранения верхних уровней индекса, можно использовать следующие шаги:
Укажите количество столбцов переменной и фиксированной длины в ключе индекса и рассчитайте объем необходимого места для их хранения:
Ключевые столбцы индекса могут включать в себя столбцы постоянной и переменной длины. Чтобы вычислить размер строки индекса на внутреннем уровне, нужно рассчитать, сколько места занимает в строке индекса каждая из этих групп столбцов. Размер столбца зависит от типа данных и длины.
- Num_Key_Cols = общее количество ключевых столбцов (фиксированной и переменной ширины).
- Fixed_Key_Size = общий размер в байтах всех ключевых столбцов фиксированной ширины.
- Num_Variable_Key_Cols = количество ключевых столбцов переменной ширины.
- Max_Var_Key_Size — максимальный размер в байтах всех ключевых столбцов переменной ширины.
Учетная запись любого уникального идентификатора, необходимого, если индекс не уникален:
Столбец уникализатора может принимать значение NULL и имеет переменную длину. Он не является NULL и занимает 4 байта в строках с неуникальными значениями ключа индекса. Это значение является частью ключа индекса и требует уникальности значения ключа во всех строках.
- Num_Key_Cols = Num_Key_ColsNum_Key_Cols + 1
- Num_Variable_Key_Cols = Num_Variable_Key_ColsNum_Variable_Key_Cols + 1
- Max_Var_Key_Size = Max_Var_Key_SizeMax_Var_Key_Size + 4
В этих изменениях предполагается, что все значения являются неуникающими.
Рассчет размера битовой карты NULL:
Если в ключе индекса существуют столбцы, допускающие значение NULL, то часть индексной строки резервируется для битовой карты NULL. Вычислите ее размер.
- Index_Null_Bitmap = 2 + ((количество столбцов в строке индекса + 7) / 8).
Следует использовать только целую часть предшествующего выражения. Остаток нужно выбросить.
Если нет ключевых столбцов, допускающих значения NULL, установите для параметра Index_Null_Bitmap значение 0.
Расчет размера данных с переменной длиной:
Если индекс содержит столбцы с переменной длиной, определим, сколько пространства потребуется для хранения этих столбцов в строке:
- Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size
Байты, добавляемые к Max_Var_Key_Size, нужны для отслеживания каждого столбца переменной ширины. Эта формула исходит из предположения, что все столбцы переменной длины заполнены на 100 %. Если вы предполагаете, что для хранения столбца переменной ширины будет использовано меньше места, для более точного подсчета общего размера таблицы можно изменить значение Max_Var_Key_Size на коэффициент заполнения места (в %).
Если нет столбцов переменной ширины, установите для параметра Variable_Key_Size значение 0.
Расчет размера индексной строки:
- Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap+ 1 (для служебных данных строки заголовка индекса) + 6 (для указателя на идентификатор дочерней страницы).
Вычислите количество строк индекса на страницу (8096 бесплатных байтов на страницу):
- Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
Так как строки индекса не охватывают страницы, количество строк индекса на страницу должно быть округлено до ближайшей целой строки. Формула
2предназначена для записи строки в массиве слотов страницы.Расчет количества уровней в индексе.
- Non-leaf_Levels = 1 + логарифм (Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)
Данное значение округляется в большую сторону до ближайшего целого числа. Это значение не включает листовой уровень кластеризованного индекса.
Вычислите количество нелистовых страниц в индексе.
Num_Index_Pages = ∑Уровень (Num_Leaf_Pages / (Index_Rows_Per_Page^Уровень))
где 1 <= Уровень <= Уровни_не_листьев
Округлите каждое слагаемое в большую сторону до ближайшего целого числа. Рассмотрим в качестве простого примера индекс, где Num_Leaf_Pages = 1000, а Index_Rows_Per_Page = 25. Первый уровень индекса над листовым уровнем хранит 1000 строк индекса, что составляет одну строку индекса на листовую страницу, и 25 строк индекса могут помещаться на каждой странице. Это означает, что для хранения этих 1000 строк индекса требуется 40 страниц. Следующий уровень индекса должен хранить 40 строк. Это означает, что требуется две страницы. Окончательный уровень индекса должен хранить две строки. Это означает, что требуется одна страница. Это дает 43 нелистовые страницы индекса. Использование этих значений в предыдущих формулах приводит к следующему результату:
Non-leaf_Levels = 1 + log(25) (1000 / 25) = 3.
Num_Index_Pages = 1000/(25^3) + 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, что составляет число страниц, описанное в примере.
Вычислите размер индекса (8192 общих байт на страницу):
- Используемое_пространство_индекса = 8192 x Количество_страниц_индекса
Шаг 3. Всего вычисляемых значений
Необходимо сложить результаты, полученные на двух предыдущих шагах.
- Размер кластеризованного индекса (в байтах) = Leaf_Space_Used + Index_Space_used
Этот расчет не учитывает следующие условия:
Секционирование: затраты на пространство от секционирования минимальны, но сложны для вычисления. Не важно включать.
Страницы выделения: есть по крайней мере одна страница IAM, используемая для отслеживания страниц, выделенных куче. Затраты на пространство минимальны, и нет алгоритма детерминированного вычисления точного количества страниц IAM.
Значения больших объектов (LOB): алгоритм, определяющий, сколько пространства будет использоваться для хранения типов данных LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml и image является сложным. Достаточно просто добавить средний размер ожидаемых значений LOB, умножить на Num_Rows, и добавить это к общему размеру кластеризованного индекса.
Сжатие: невозможно предварительно вычислить размер сжатого индекса.
Разреженные столбцы: сведения о требованиях к пространству разреженных столбцов см. в разделе "Использование разреженных столбцов".