Compartir a través de


Estimar el tamaño de un índice no agrupado

Para estimar el espacio necesario para almacenar un índice no agrupado, puede utilizar los siguientes pasos:

  1. Calcular el espacio utilizado para almacenar información del índice en los niveles no hoja del índice no agrupado.
  2. Calcular el espacio utilizado para almacenar información del índice en el nivel hoja del índice no agrupado.
  3. Sumar el total de los valores calculados.

Paso 1. Calcular el espacio utilizado para almacenar información del índice en los niveles no hoja

ms190620.note(es-es,SQL.90).gifImportante:
Conserve los valores utilizados en este paso para volverlos a usar en el Paso 2.

Para estimar el espacio necesario para almacenar los niveles superiores del índice, puede utilizar los siguientes pasos:

  1. Especifique el número de filas que habrá en la tabla:
    Num_Rows = número de filas de la tabla
  2. 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 variable. Para estimar el tamaño de fila del índice de nivel interior, calcule el espacio que ocupa cada uno de estos grupos de columnas en la fila del índice. El tamaño de una columna depende del tipo y de la longitud especificados para los datos. Para obtener más información, vea Tipos de datos (motor de base de datos).
    Num_Key_Cols = número total de columnas de clave (longitud fija y 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 en bytes de todas las columnas de clave de longitud variable
  3. Tenga en cuenta el localizador de fila de datos necesario si el índice no es único:
    Si el índice no agrupado no es único, el localizador de fila de datos se combina con la clave del índice no agrupado para generar un valor clave único para cada fila.
    Si el índice no agrupado se encuentra sobre un montón, el localizador de fila de datos es el RID del montón. Tiene un tamaño de 8 bytes.
    Num_Key_Cols = Num_Key_Cols + 1
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
    Max_Var_Key_Size = Max_Var_Key_Size +8
    Si el índice no agrupado se encuentra sobre un índice agrupado, el localizador de fila de datos es la clave de agrupación. Las columnas que se deben combinar con la clave del índice no agrupado son las columnas de la clave de agrupación que ya no están presentes en el conjunto de columnas de clave de índice no agrupado.
    Num_Key_Cols = Num_Key_Cols + número de columnas de la clave de agrupación que no estén en el conjunto de columnas de clave de índice no agrupado (+ 1 si el índice agrupado no es único)
    Fixed_Key_Size = Fixed_Key_Size + tamaño total en bytes de las columnas de clave de agrupación de longitud fija que no se estén en el conjunto de columnas de clave de índice no agrupado
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + número de columnas de clave de agrupación de longitud variable que no estén en el conjunto de columnas de clave de índice no agrupado (+ 1 si el índice agrupado no es único)
    Max_Var_Key_Size = Max_Var_Key_Size + tamaño máximo en bytes de las columnas de clave de agrupación de longitud variable que no estén en el conjunto de columnas de clave de índice no agrupado (+ 4 si el índice agrupado no es único)
  4. Se puede reservar parte de la fila, conocida como el mapa de bits NULL, para administrar la capacidad de aceptar valores NULL en las columnas. Calcule el tamaño:
    Si existen columnas que aceptan valores NULL en la clave del índice, incluidas las columnas de clave de agrupación necesarias descritas en el Paso 1.3, se reserva parte de la fila de índice para el mapa de bits NULL.
    Index_Null_Bitmap = 2 + ((número de columnas de clave que aceptan valores NULL + 7) / 8)
    Sólo debe utilizarse la parte entera de la expresión anterior. Descarte el resto.
    Si no existen columnas de clave que aceptan 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 agrupado necesarias, determine cuánto espacio se utiliza para almacenar las columnas de la fila de índice:
    Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size En esta fórmula, se supone que todas las columnas de longitud variable están llenas al 100%. Si prevé que va a utilizarse un porcentaje inferior del espacio de almacenamiento de las 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 de la tabla.
    Si no hay columnas de longitud variable, establezca Variable_Key_Size en 0.
  6. Calcule el tamaño de la fila del índice:
    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (para sobrecarga de encabezado de una fila de índice) + 6 (para el puntero de Id. de página secundaria)
  7. Calcule el número de filas de índice por página (8096 bytes disponibles por página):
    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
    Dado que las filas de índice no abarcan varias páginas, el número de filas de índice por página debe redondearse hacia abajo a la fila completa más cercana. El valor 2 de la fórmula corresponde a la entrada de la fila en la matriz de zona de la página.
  8. Calcule el número de niveles del índice:
    Levels = 1 + log Index_Rows_Per_Page (Num_Rows / Index_Rows_Per_Page)
    Tenga en cuenta que este valor no incluye el nivel hoja del índice no agrupado.
  9. Calcule el número de páginas del índice:
    Num_Index_Pages = ?Level (Index_Rows_Per_Page)Level – 1
    donde 1 <= Level <= Levels
    Como ejemplo sencillo, considere un índice en el que el número total de filas de índice necesario en el nivel situado sobre la hoja es 1000 y caben 10 filas de índice por página. Esto significa que se necesitan 100 páginas para almacenar las 1000 filas. El siguiente nivel del índice debe almacenar 100 filas. Esto significa que necesita 10 páginas. El nivel final del índice debe almacenar 10 filas. Esto significa que necesita 1 página. Si utiliza estos números en las fórmulas anteriores, obtiene el siguiente resultado:
    Height = 1 + log10 (1000 / 10) = 3
    Num_Index_Pages = (10)3-1 + (10)2-1 + (10)1-1 = 111, que es el número de páginas descrito en el ejemplo.
  10. Calcule el tamaño del índice (8192 bytes por página):
    Index_Space_Used* = 8192 x *Num_Index_Pages

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

Para estimar el espacio necesario para almacenar el nivel hoja del índice, puede utilizar los siguientes pasos. Para completar este paso, necesita los valores del Paso 1.

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

    [!NOTA] SQL Server 2005 presenta la capacidad de ampliar un índice no agrupado mediante la inclusión de columnas sin clave además de las columnas de clave de índice. Estas columnas adicionales sólo se almacenan en el nivel hoja del índice no agrupado. Para obtener más información, vea Crear índices con columnas incluidas.

    [!NOTA] SQL Server 2005 presenta la capacidad de combinar columnas varchar, nvarchar, varbinary o sql_variant, de forma que el ancho de tabla total definido puede superar los 8060 bytes. La longitud de cada una de estas columnas debe ajustarse al límite de 8000 bytes en columnas varchar, varbinary o sql_variant y de 4000 bytes en columnas nvarchar. Sin embargo, el ancho combinado puede superar el límite de 8060 bytes de una tabla. Esto también se aplica a filas de hoja de índice no agrupado con columnas incluidas. Para obtener más información, vea Datos de desbordamiento de fila superiores a 8 KB.

    Si el índice no agrupado no incluye columnas, utilice los valores del Paso 1, incluidas las modificaciones determinadas en el Paso 1.3:
    Num_Key_Cols = Num_Key_Cols + 1
    Fixed_Leaf_Size* = *Fixed_Key_Size Num_Variable_Leaf_Cols* = *Num_Variable_Key_Cols Max_Var_Leaf_Size* = *Max_Var_Key_Size Si el índice no agrupado no incluye columnas, agregue los valores correspondientes a los valores del Paso 1, incluidas las modificaciones del Paso 1.3. El tamaño de una columna depende del tipo y de la longitud especificados para los datos. Para obtener más información, vea Tipos de datos (motor de base de datos).
    Num_Leaf_Cols = Num_Key_Cols + número de columnas no incluidas
    Fixed_Leaf_Size = Fixed_Key_Size + tamaño total en bytes de las columnas incluidas de longitud fija
    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + número de columnas incluidas de longitud variable
    Max_Var_Leaf_Size = Max_Var_Key_Size + tamaño máximo en bytes de las columnas incluidas de longitud variable

  2. Tenga en cuenta el localizador de fila de datos:
    Si el índice no agrupado no es único, la sobrecarga del localizador de fila de datos ya se ha tenido en cuenta en el Paso 1.3, por lo que no es necesario efectuar ninguna modificación adicional. Vaya al paso siguiente.
    Si el índice no agrupado es único, el localizador de fila de datos debe tenerse en cuenta en todas las filas del nivel hoja.
    Si el índice no agrupado se encuentra sobre un montón, el localizador de fila de datos es el RID del montón (tamaño 8 bytes).
    Num_Leaf_Cols = Num_Leaf_Cols + 1
    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1
    Max_Var_Leaf_Size = Max_Var_Leaf_Size + 8
    Si el índice no agrupado se encuentra sobre un índice agrupado, el localizador de fila de datos es la clave de agrupación. Las columnas que se deben combinar con la clave del índice no agrupado son las columnas de la clave de agrupación que ya no están presentes en el conjunto de columnas de clave de índice no agrupado.
    Num_Leaf_Cols = Num_Leaf_Cols + número de columnas de la clave de agrupación que no estén en el conjunto de columnas de clave de índice no agrupado (+ 1 si el índice agrupado no es único)
    Fixed_Leaf_Size = Fixed_Leaf_Size + número de columnas de clave de agrupación de longitud fija que no estén en el conjunto de columnas de clave de índice no agrupado
    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + número de columnas de clave de agrupación de longitud variable que no estén en el conjunto de columnas de clave de índice no agrupado (+ 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 de longitud variable que no estén en el conjunto de columnas de clave de índice no agrupado (+ 4 si el índice agrupado no es único)

  3. Calcule el tamaño del mapa de bits de valor NULL:
    Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)
    Sólo debe utilizarse la parte entera de la expresión anterior. Descarte el resto.

  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 necesarias según se describe en el Paso 2.2, determine cuánto espacio se utiliza para almacenar las columnas de la fila de índice:
    Variable_Leaf_Size* = 2 + (Num_Variable_Leaf_Cols x 2) + *Max_Var_Leaf_Size En esta fórmula, se supone que todas las columnas de longitud variable están llenas al 100%. Si prevé que va a utilizarse un porcentaje inferior del espacio de almacenamiento de las columnas de longitud variable, puede ajustar el valor de Max_Var_Leaf_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_Leaf_Size en 0.

  5. Calcule el tamaño de la fila del índice:
    Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (para sobrecarga de encabezado de una fila de índice) + 6 (para el puntero de Id. de página secundaria)

  6. Calcule el número de filas de índice por página (8096 bytes disponibles por página):
    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
    Dado que las filas de índice no abarcan varias páginas, el número de filas de índice por página debe redondearse hacia abajo a la fila completa más cercana. El valor 2 de la fórmula corresponde a la entrada de la fila en la matriz de zona de la página.

  7. 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) / (Leaf_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 varias páginas, el número de filas por página debe redondearse hacia abajo a la fila completa más cercana. A medida que aumenta el factor de relleno, más datos se almacenan en cada página y menos páginas habrá. El valor 2 de la fórmula corresponde a la entrada de la fila en la matriz de zona de la página.

  8. Calcule el número de páginas necesarias para almacenar todas las filas:
    Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)
    El número de páginas estimado debe redondearse hacia arriba a la página completa más cercana.

  9. Calcule el tamaño del índice (8192 bytes por página):
    Leaf_Space_Used* = 8192 x *Num_Leaf_Pages

Paso 3. Sumar el total de los valores calculados

Calcule el total de los valores obtenidos en los dos pasos anteriores:

Tamaño de índice no agrupado (bytes) = Leaf_Space_Used + Index_Space_used

En este cálculo no se tiene en cuenta lo siguiente:

  • Particiones
    La sobrecarga de espacio de las particiones es mínima, pero resulta complejo calcularla. No es importante incluirla.
  • Páginas de asignación
    Se utiliza al menos una página IAM para realizar un seguimiento de las páginas asignadas a un montón, pero la sobrecarga de espacio es mínima y no existe ningún algoritmo para calcular de forma determinista el número exacto de páginas IAM que se utilizarán.
  • Valores de objetos grandes (LOB)
    El algoritmo que permite determinar exactamente la cantidad de espacio que se utilizará para almacenar los tipos de datos LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml y los valores image es complejo. Basta con agregar el tamaño medio de los valores LOB esperados, multiplicarlo por Num_Rows y sumar el resultado al tamaño total del índice no agrupado.

Vea también

Conceptos

Directrices para diseñar índices agrupados
Crear índices (motor de base de datos)
Directrices para diseñar índices no agrupados
Calcular el tamaño de una tabla
Estimar el tamaño de un índice agrupado
Estimar el tamaño de un montón

Otros recursos

Estimar el tamaño de una base de datos

Ayuda e información

Obtener ayuda sobre SQL Server 2005