Compartir a través de


Calcular el tamaño de un índice agrupado

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

Los siguientes pasos pueden utilizarse para calcular el espacio necesario para almacenar datos en un índice clúster:

  1. Calcule el espacio utilizado para almacenar datos en el nivel hoja del índice clúster.
  2. Calcule el espacio utilizado para almacenar información del índice clúster.
  3. Sumar los valores calculados.

Paso 1. Calcular el espacio usado para almacenar datos en el nivel hoja

  1. Especifique el número de filas 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, y calcule el espacio necesario para su almacenamiento:

    Calcule el espacio que ocupa cada uno de estos grupos de columnas en la fila de datos. El tamaño de una columna depende del tipo y de la longitud especificados para los datos.

    • Num_Cols = número total de columnas (de longitud fija y variable)
    • Fixed_Data_Size = tamaño total en bytes de todas las columnas de longitud fija
    • Num_Variable_Cols = número de columnas de longitud variable
    • Max_Var_Size = tamaño máximo en bytes de todas las columnas de longitud variable
  3. Si el índice clúster no es único, tenga en cuenta la columna uniqueifier :

    La columna de valor de unicidad es una columna de longitud variable que admite valores NULL. Es no nulo y de un tamaño de 4 bytes en filas que tienen valores de clave no únicos. Este valor forma parte de la clave de índice y es necesario para asegurarse de que cada fila tiene un valor de clave único.

    • = Num_Cols + 1
    • Num_Variable_Cols = Num_Variable_ColsNum_Variable_Cols + 1
    • = Max_Var_SizeMax_Var_Size + 4

    Estas modificaciones suponen que todos los valores no son únicos.

  4. Una parte de la fila, conocida como el mapa de bits NULL, se reserva para administrar la nulabilidad en las columnas. Calcule el tamaño:

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

    Solo debe utilizarse la parte entera de la expresión anterior; descarte el resto.

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

    Si hay columnas de longitud variable en la tabla, determine cuánto espacio se utiliza para almacenar las columnas en la fila:

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

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

    Puede combinar las columnas varchar, nvarchar, varbinaryo sql_variant que hacen que el ancho total definido para la tabla sea superior a 8060 bytes. La longitud de cada una de estas columnas debe ajustarse al límite de 8000 bytes en columnas varchar, varbinaryo sql_variant y de 4000 bytes en columnas nvarchar . Sin embargo, sus anchos combinados podrían superar el límite de 8060 bytes en una tabla.

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

  6. Calcule el tamaño total de la fila:

    • Tamaño_de_Fila = Tamaño_de_Datos_Fijos + Tamaño_de_Datos_Variable + Null_Bitmap + 4

    El valor 4 representa la sobrecarga del encabezado de una fila de datos.

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

    • Rows_Per_Page = 8096 / (Row_Size + 2)

    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. El valor 2 de la fórmula representa la entrada de la fila en la matriz de zonas de la página.

  8. Calcule el número de filas libres reservadas por página, basándose en el valor de factor de relleno especificado:

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

    El factor de relleno que se utiliza en el cálculo es un valor entero y no 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 almacenan más datos en cada página y hay menos páginas. El valor 2 de la fórmula representa la entrada de la fila en la matriz de zonas de la página.

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

    • Num_Páginas_De_Hoja = Num_Filas / (Filas_Por_Página - Filas_Libres_Por_Página)

    El número de páginas estimado debe redondearse hacia arriba a la página completa más cercana.

  10. Calcule la cantidad de espacio necesario para almacenar los datos en el nivel hoja (8192 bytes totales por página):

    • Leaf_space_used = 8192 x Num_Leaf_Pages

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

Los siguientes pasos pueden utilizarse para calcular el espacio necesario para almacenar los niveles superiores del índice:

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

    Las columnas de clave de un índice pueden incluir columnas de longitud fija y de longitud variable. Para estimar el tamaño de las filas de índice de nivel interior, calcule el espacio que ocupa cada uno de estos grupos de columnas en la fila de índice. El tamaño de una columna depende del tipo y de la longitud especificados para los datos.

    • Num_Key_Cols = número total de columnas de clave (de longitud fija y variable)
    • Fixed_Key_Size = tamaño total en 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 en bytes de todas las columnas de clave de longitud variable
  2. Tenga en cuenta cualquier elemento único que sea necesario si el índice no es distintivo.

    La columna de valor de unicidad es una columna de longitud variable que admite valores NULL. Es no nulo y de 4 bytes de tamaño en filas que tienen valores de clave de índice no únicos. Este valor forma parte de la clave de índice y es necesario para asegurarse de que cada fila tiene un valor de clave único.

    • 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

    Estas modificaciones suponen que todos los valores no son únicos.

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

    Si hay columnas que admiten valores NULL en la clave de índice, una parte de la fila de índice se reserva para el mapa de bits NULL. Calcule el tamaño:

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

    Solamente debe utilizarse la parte entera de la expresión anterior. Descarte el resto.

    Si no hay columnas de clave que aceptan valores NULL, establezca Index_Null_Bitmap en 0.

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

    Si hay columnas de longitud variable en el índice, determine cuánto espacio se utiliza para almacenar las columnas en 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 el seguimiento de cada columna de longitud variable. En esta fórmula se supone que todas las columnas de longitud variable están llenas al 100%. Si prevé que se va a usar un porcentaje inferior del espacio de almacenamiento de columnas de longitud variable, puede ajustar el valor de Max_Var_Key_Size en función de ese porcentaje para obtener una estimación más precisa del tamaño global de la tabla.

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

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

    • Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap+ 1 (para la sobrecarga de encabezado de una fila de índice) + 6 (para el puntero de identificador de página secundaria)
  6. 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 elemento 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 niveles del índice:

    • Niveles_no_hoja = 1 + logaritmo (Index_Rows_Per_Page) (Num_Leaf_Pages / Index_Rows_Per_Page)

    Redondee este valor al número entero más próximo. Este valor no incluye el nivel hoja del índice agrupado.

  8. Calcule el número de páginas que no son hoja en el índice.

    • Num_Index_Pages = ∑Level (Num_Leaf_Pages / (Index_Rows_Per_Page * ^))

      donde 1<= Level <= Non-leaf_Levels

    Redondee cada sumando al número entero más próximo. Como ejemplo sencillo, considere un índice en el que Num_Leaf_Pages = 1000 e Index_Rows_Per_Page = 25. El primer nivel de índice por encima del nivel de hoja almacena 1,000 filas de índice, es decir, una fila de índice por página de hoja, y 25 filas de índice pueden caber por página. Esto significa que se necesitan 40 páginas para almacenar esas 1000 filas de índice. El siguiente nivel del índice debe almacenar 40 filas. Esto significa que requiere dos páginas. El nivel final del índice tiene que almacenar dos filas. Esto significa que requiere una página. Esto genera 43 páginas de índice intermedias. Si se utilizan estos números en las fórmulas anteriores, el resultado será el siguiente:

    • 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, que es el número de páginas que se describe en el ejemplo.

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

    • Index_Space_Used = 8192 x Num_Index_Pages

Paso 3. Total de los valores calculados

Sume los valores obtenidos en los dos pasos anteriores:

  • Tamaño del índice agrupado (bytes) = Leaf_Space_Used + Index_Space_used

Este cálculo no tiene en cuenta las siguientes condiciones:

  • Creación de particiones: 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 IAM que se usa para realizar un seguimiento de las páginas asignadas a un montón. La sobrecarga del espacio es mínima y no hay ningún algoritmo para calcular exactamente cuántas páginas de IAM se usarán exactamente.

  • 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 los valores de imagen es complejo. Basta con agregar el tamaño medio de los valores LOB que se esperan, multiplicar por Num_Rows y agregarlo al tamaño total del índice agrupado.

  • 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, consulte Uso de columnas dispersas.