Estructuras de índices no agrupados

Los índices no agrupados tienen la misma estructura de árbol b que los índices agrupados, excepto por las siguientes diferencias importantes:

  • Las filas de datos de la tabla subyacente no están ordenadas ni almacenadas basándose en sus claves no agrupadas.

  • La capa de hoja de un índice no agrupado está compuesta por páginas de índices, en lugar de páginas de datos.

Los índices no agrupados se pueden definir en una tabla o vista con un índice clúster o un montón. Cada fila del índice no agrupado contiene un valor de clave no agrupada y un localizador de fila. Este localizador apunta a la fila de datos del índice clúster o el montón que contiene el valor de clave.

Los localizadores de filas de las filas de índices no agrupados pueden ser un puntero a la fila o una clave de índice agrupado para una fila, tal como se describe a continuación:

  • Si la tabla es un montón, lo que significa que no tiene ningún índice agrupado, el localizador de fila es un puntero a la fila. El puntero se genera a partir del identificador (Id.) de archivo, el número de página y el número de la fila dentro de la página. El puntero completo se conoce como Id. de fila (RID).

  • Si la tabla tiene un índice clúster o si el índice está en una vista indizada, el localizador de fila es la clave del índice clúster para la fila. Si el índice clúster no es un índice único, SQL Server hace que las claves duplicadas sean únicas agregando un valor generado internamente denominado valor de unicidad. Este valor de cuatro bytes no es visible para los usuarios. Sólo se agrega cuando es necesario para que la clave agrupada sea única para usarla en los índices no agrupados. SQL Server recupera la fila de datos buscando el índice clúster con el valor de clave del índice clúster que está almacenado en la fila de hoja del índice no agrupado.

Los índices no agrupados tienen una fila en sys.partitions, con index_id >0 para cada partición utilizada por el índice. De forma predeterminada, un índice no agrupado tiene una sola partición. Cuando un índice no agrupado tiene varias particiones, cada una tiene una estructura de árbol b que contiene las filas de índice de esa partición específica. Por ejemplo, si un índice no agrupado tiene cuatro particiones, habrá cuatro estructuras de árbol b, una en cada partición.

En función de los tipos de datos del índice no agrupado, cada estructura de índice no agrupado tendrá una o más unidades de asignación en las que almacenar y administrar los datos de una partición específica. Como mínimo, cada índice no agrupado tendrá una unidad de asignación IN_ROW_DATA por partición encargada de almacenar las páginas de árbol b del índice. El índice no agrupado también tendrá una unidad de asignación LOB_DATA por partición si contiene columnas de objetos grandes (LOB). También tendrá una unidad de asignación ROW_OVERFLOW_DATA por partición si contiene columnas de longitud variable que superen el límite de tamaño de fila de 8.060 bytes. Para obtener más información acerca de las unidades de asignación, vea Organización de tablas e índices. Las colecciones de páginas del árbol b están delimitadas por punteros root_page en la vista del sistema sys.system_internals_allocation_units.

Nota importanteImportante

La vista del sistema sys.system_internals_allocation_units sólo puede utilizarla internamente Microsoft SQL Server. La compatibilidad con versiones posteriores no está garantizada.

En la siguiente ilustración se muestra la estructura de un índice no agrupado en una sola partición.

Niveles de un índice no clúster

Índices de columna incluidos

La funcionalidad de los índices no agrupados puede ampliarse si se agregan columnas incluidas, denominadas columnas sin clave, en el nivel hoja del índice. Las columnas de clave se almacenan en todos los niveles de índice no agrupado, mientras que las columnas sin clave sólo se almacenan en el nivel hoja. Para obtener más información, vea Índice con columnas incluidas.