Compartir a través de


Calcular el tamaño de un índice no agrupado

Siga estos pasos para calcular la cantidad de espacio necesario para almacenar un índice no clúster:

  1. Calcule las variables para su uso en los pasos 2 y 3.

  2. Calcule el espacio utilizado para almacenar información de índice en el nivel de hoja del índice no agrupado.

  3. Calcule el espacio utilizado para almacenar información de índice en los niveles no hoja del índice no agrupado.

  4. Total de los valores calculados.

Paso 1. Calcular variables para su uso en los pasos 2 y 3

Puede usar los pasos siguientes para calcular variables que se usan para calcular la cantidad de espacio necesario para almacenar los niveles superiores del índice.

  1. Especifique el número de filas que estarán presentes en la tabla:

    Num_Rows = número de filas de la tabla

  2. Especifique el número de columnas de longitud fija y de longitud variable en la clave de índice y calcule el espacio necesario para su almacenamiento:

    Las columnas clave de un índice pueden incluir columnas de longitud fija y de longitud variable. Para calcular el tamaño de fila del índice de nivel interior, calcule el espacio que ocupa cada uno de estos grupos de columnas dentro de la fila de índice. El tamaño de una columna depende del tipo de datos y la especificación de longitud.

    Num_Key_Cols = número total de columnas de clave (longitud fija y longitud variable)

    Fixed_Key_Size = tamaño total de bytes de todas las columnas de clave de longitud fija

    Num_Variable_Key_Cols = número de columnas de clave de longitud variable

    Max_Var_Key_Size = tamaño máximo de bytes de todas las columnas de clave de longitud variable

  3. Tenga en cuenta el localizador de filas de datos necesario si el índice no es único:

    Si el índice no clúster no es único, el localizador de filas de datos se combina con la clave de índice no agrupada para generar un valor de clave único para cada fila.

    Si el índice no clúster está sobre un montón, el localizador de filas de datos es el RID del montón. Se trata de un tamaño de 8 bytes.

    Num_Key_Cols = Num_Key_ColsNum_Key_Cols + 1

    = Num_Variable_Key_ColsNum_Variable_Key_Cols + 1

    Max_Var_Key_Size = Max_Var_Key_Size + 8

    Si el índice no clúster está sobre un índice agrupado, el localizador de filas de datos es la clave de agrupación en clústeres. Las columnas que se deben combinar con la clave de índice no agrupada son esas columnas de la clave de agrupación en clústeres que aún no están presentes en el conjunto de columnas de clave de índice no agrupadas.

    = Num_Key_ColsNum_Key_Cols + número de columnas clave de agrupación que no están en el conjunto de columnas clave de índice no agrupadas (+ 1 si el índice agrupado no es único)

    Fixed_Key_Size = Fixed_Key_Size + tamaño total de bytes de las columnas de clave de agrupación de longitud fija que no están en el conjunto de columnas de clave de índice no agrupadas

    Num_Variable_Key_Cols = Num_Variable_Key_Cols + número de columnas clave de agrupación en clústeres de longitud variable que no están en el conjunto de columnas clave del índice no agrupado (+ 1 si el índice agrupado es no único)

    Max_Var_Key_Size = Max_Var_Key_Size + tamaño máximo en bytes de las columnas de clave de agrupamiento de longitud variable que no están en el conjunto de columnas de clave de índice no agrupado (+ 4 si el índice agrupado es no único)

  4. Parte de la fila, conocida como mapa de bits nulo, se puede reservar para administrar la nulabilidad de la columna. Calcule su tamaño:

    Si hay columnas que aceptan valores NULL en la clave de índice, incluidas las columnas de clave de agrupación en clústeres necesarias, como se describe en el paso 1.3, parte de la fila de índice se reserva para el mapa de bits NULL.

    Index_Null_Bitmap = 2 + ((número de columnas en la fila de índice + 7) / 8)

    Solo se debe usar la parte entera de la expresión anterior. Descarte cualquier resto.

    Si no hay ninguna columna de clave que acepta valores NULL, establezca Index_Null_Bitmap en 0.

  5. Calcule el tamaño de los datos de longitud variable:

    Si hay columnas de longitud variable en la clave de índice, incluidas las columnas de clave de índice agrupadas necesarias, determine cuánto espacio se usa para almacenar las columnas dentro de la fila de índice:

    Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

    Los bytes agregados a Max_Var_Key_Size son para realizar el seguimiento de cada columna variable. En esta fórmula se supone que todas las columnas de longitud variable están llenas al 100 %. Si prevé que se usará un porcentaje menor del espacio de almacenamiento de columnas de longitud variable, puede ajustar el valor de Max_Var_Key_Size por ese porcentaje para producir una estimación más precisa del tamaño general de la tabla.

    Si no hay ninguna columna de longitud variable, establezca Variable_Key_Size en 0.

  6. Calcule el tamaño de la fila de índice:

    Tamaño_Fila_Índice = Tamaño_Clave_Fija + Tamaño_Clave_Variable + Mapa_Null_Índice + 1 (para la sobrecarga de encabezado de fila de una fila de índice) + 6 (para el puntero del identificador de página secundaria)

  7. Calcule el número de filas de índice por página (8096 bytes libres por página):

    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    Dado que las filas de índice no abarcan páginas, el número de filas de índice por página debe redondearse hacia abajo hasta la fila completa más cercana. El 2 de la fórmula corresponde a la entrada de la fila en la matriz de ranuras de la página.

Paso 2. Calcular el espacio usado para almacenar información de índice en el nivel hoja

Puede usar los pasos siguientes para calcular la cantidad de espacio necesario para almacenar el nivel hoja del índice. Necesitará los valores conservados del paso 1 para completar este paso.

  1. Especifique el número de columnas de longitud fija y de longitud variable en el nivel hoja y calcule el espacio necesario para su almacenamiento:

    Nota:

    Puede extender un índice no agrupado mediante la inclusión de columnas sin clave además de las columnas de clave de índice. Estas columnas adicionales solo se almacenan en el nivel de hoja del índice no agrupado. Para más información, consulte Create Indexes with Included Columns.

    Nota:

    Puede combinar varcharcolumnas , nvarchar, varbinaryo sql_variant que hacen que el ancho de tabla definido total supere los 8060 bytes. La longitud de cada una de estas columnas todavía debe estar dentro del límite de 8000 bytes para una varcharcolumna , varbinaryo sql_variant y 4000 bytes para nvarchar las columnas. Sin embargo, sus anchos combinados pueden superar el límite de 8060 bytes en una tabla. Esto también se aplica a las filas hoja de índice no agrupadas que han incluido columnas.

    Si el índice no clúster no tiene ninguna columna incluida, use los valores del paso 1, incluidas las modificaciones determinadas en el paso 1.3:

    = Num_Leaf_ColsNum_Key_Cols

    Tamaño_Fijo_de_Hoja = Tamaño_Fijo_de_Clave

    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols

    Max_Var_Leaf_Size = Max_Var_Key_Size

    Si el índice no agrupado tiene columnas incluidas, agregue los valores adecuados a los valores del paso 1, incluidas las modificaciones del paso 1.3. El tamaño de una columna depende del tipo de datos y la especificación de longitud. Para obtener más información, vea Tipos de datos (Transact-SQL).

    Num_Leaf_Cols = Num_Key_Cols + número de columnas incluidas

    Fixed_Leaf_Size = Fixed_Key_Size + tamaño total de bytes de columnas incluidas de longitud fija

    = Num_Variable_Leaf_ColsNum_Variable_Key_Cols + número de columnas incluidas de longitud variable

    Max_Var_Leaf_Size = Max_Var_Key_Size + tamaño máximo de bytes de columnas incluidas de longitud variable

  2. Ten en cuenta el localizador de la fila de datos:

    Si el índice no clúster no es único, la sobrecarga para el localizador de filas de datos ya se ha considerado en el paso 1.3 y no se requieren modificaciones adicionales. Vaya al próximo paso.

    Si el índice no agrupado es único, el localizador de filas de datos debe tenerse en cuenta en todas las filas en el nivel hoja.

    Si el índice no clúster está sobre un montón, el localizador de filas de datos es el RID del montón (tamaño 8 bytes).

    = Num_Leaf_ColsNum_Leaf_Cols + 1

    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1

    = Max_Var_Leaf_SizeMax_Var_Leaf_Size + 8

    Si el índice no clúster está sobre un índice agrupado, el localizador de filas de datos es la clave de agrupación en clústeres. Las columnas que se deben combinar con la clave de índice no agrupada son esas columnas de la clave de agrupación en clústeres que aún no están presentes en el conjunto de columnas de clave de índice no agrupadas.

    Num_Leaf_Cols = Num_Leaf_Cols + número de columnas de clave de clúster que no están en el conjunto de columnas de clave de índice no agrupadas (+ 1 si el índice agrupado no es único)

    = Fixed_Leaf_SizeFixed_Leaf_Size + número de columnas de clave de agrupación en clústeres de longitud fija que no están en el conjunto de columnas de clave de índice no agrupadas

    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + número de columnas de clave de longitud variable en el índice de agrupación que no están en el conjunto de columnas de clave del índice no agrupadas (+ 1 si el índice agrupado no es único)

    Max_Var_Leaf_Size = Max_Var_Leaf_Size + tamaño en bytes de las columnas de clave de agrupación en clúster de longitud variable que no están en el conjunto de columnas de clave de índice no agrupado (+ 4 si el índice agrupado es no único)

  3. Calcule el tamaño del mapa de bits NULL:

    Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)

    Solo se debe usar la parte entera de la expresión anterior. Descarte cualquier residuo.

  4. Calcule el tamaño de los datos de longitud variable:

    Si hay columnas de longitud variable en la clave de índice, incluidas las columnas de clave de agrupación en clústeres necesarias, como se describió anteriormente en el paso 2.2, determine cuánto espacio se usa para almacenar las columnas dentro de la fila de índice:

    Variable_Leaf_Size = 2 + (Num_Variable_Leaf_Cols x 2) + Max_Var_Leaf_Size

    Los bytes agregados a Max_Var_Key_Size son para realizar el seguimiento de cada columna variable. En esta fórmula se supone que todas las columnas de longitud variable están llenas al 100 %. Si prevé que se usará un porcentaje menor del espacio de almacenamiento de columnas de longitud variable, puede ajustar el valor de Max_Var_Leaf_Size por ese porcentaje para producir una estimación más precisa del tamaño general de la tabla.

    Si no hay columnas de longitud variable, establezca Variable_Leaf_Size en 0.

  5. Calcule el tamaño de la fila de índice:

    Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (para la sobrecarga de encabezado de una fila de índice) + 6 (para el puntero del identificador de la página secundaria)

  6. Calcule el número de filas de índice por página (8096 bytes libres por página):

    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)

    Dado que las filas de índice no abarcan páginas, el número de filas de índice por página debe redondearse hacia abajo hasta la fila completa más cercana. El 2 de la fórmula es para la entrada de la fila en la matriz de ranuras de la página.

  7. Calcule el número de filas libres reservadas por página, en función del factor de relleno especificado:

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

    El factor de relleno utilizado en el cálculo es un valor entero en lugar de un porcentaje. Dado que las filas no abarcan páginas, el número de filas por página debe redondearse hacia abajo hasta la fila completa más cercana. A medida que crece el factor de relleno, se almacenarán más datos en cada página y habrá menos páginas. El 2 de la fórmula corresponde al elemento de la fila en la matriz de ranuras de la página.

  8. Calcule el número de páginas necesarias para almacenar todas las filas:

    = Num_Leaf_PagesNum_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)

    El número de páginas estimadas debe redondearse hasta la página completa más cercana.

  9. Calcule el tamaño del índice (8192 bytes totales por página):

    Leaf_Space_Used = 8192 x Num_Leaf_Pages

Paso 3. Calcular el espacio usado para almacenar información de índice en los niveles no hoja

Siga estos pasos para calcular la cantidad de espacio necesario para almacenar los niveles intermedios y raíz del índice. Necesitará los valores conservados de los pasos 2 y 3 para completar este paso.

  1. Calcule el número de niveles que no son hoja en el índice.

    Niveles no hoja = 1 + logaritmo de Index_Rows_Per_Page (Num_Leaf_Pages / Index_Rows_Per_Page)

    Redondea este valor hasta el número entero más cercano. Este valor no incluye el nivel de la hoja del índice no agrupado.

  2. Calcule el número de páginas no hoja en el índice:

    Num_Index_Pages = ∑Nivel (Num_Leaf_Pages/Index_Rows_Per_PageNivel) donde 1 <= Nivel <= Niveles

    Redondea cada suma hasta el número entero más cercano. Como ejemplo sencillo, considere un índice donde Num_Leaf_Pages = 1000 y Index_Rows_Per_Page = 25. El primer nivel de índice por encima del nivel hoja almacena 1000 filas de índice; es decir, una fila de índice por página hoja, y 25 filas de índice caben por página. Esto significa que se necesitan 40 páginas para almacenar esas 1000 filas de índice. El siguiente nivel del índice tiene que almacenar 40 filas. Esto significa que requiere 2 páginas. El nivel final del índice tiene que almacenar 2 filas. Esto significa que requiere 1 página. Esto produce 43 páginas de índice no hoja. Cuando estos números se usan en las fórmulas anteriores, el resultado es el siguiente:

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

    Num_Index_Pages = 1000/(253)+ 1000/(252) + 1000/(251) = 1 + 2 + 40 = 43, que es el número de páginas descritas en el ejemplo.

  3. Calcule el tamaño del índice (8192 bytes totales por página):

    Index_Space_Used = 8192 x Num_Index_Pages

Paso 4. Total de los valores calculados

Total de los valores obtenidos de los dos pasos anteriores:

Tamaño de índice no clúster (bytes) = Leaf_Space_Used + Index_Space_used

Este cálculo no tiene en cuenta lo siguiente:

  • Partición

    La sobrecarga de espacio de la creación de particiones es mínima, pero compleja de calcular. No es importante incluir.

  • Páginas de asignación

    Hay al menos una página de IAM que se usa para realizar un seguimiento de las páginas asignadas a un montón, pero la sobrecarga del espacio es mínima y no hay ningún algoritmo para calcular exactamente cuántas páginas IAM se usarán.

  • Valores de objetos grandes (LOB)

    El algoritmo para determinar exactamente cuánto espacio se usará para almacenar los tipos de datos LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml y image es complejo. Basta con agregar el tamaño medio de los valores LOB esperados, multiplicar por Num_Rows y agregarlo al tamaño total del índice no clúster.

  • Compresión

    No se puede calcular previamente el tamaño de un índice comprimido.

  • Columnas dispersas

    Para obtener información sobre los requisitos de espacio de las columnas dispersas, vea Usar columnas dispersas.

Véase también

Índices agrupados y no agrupados descritos
Creación de índices no clúster
Creación de índices agrupados
Calcular el tamaño de una tabla
Estimar el tamaño de un índice clúster
Estimar el tamaño de un montón
Estimar el tamaño de una base de datos