¿Cuánto espacio ocupará un índice no clúster y por qué?

A la hora de crear un índice en una de nuestras tablas, especialmente si es de un tamaño considerable, una de las preguntas que nos pueden surgir es: ¿Cuánto espacio nos va a ocupar?

Veamos un ejemplo concreto, y luego trataremos de explicarlo. Imaginemos que tenemos una tabla con los clientes de un gimnasio, con una primary key que sería el número de socio, y que realizamos muchas búsquedas basadas en el número de teléfono del cliente. Nos estaríamos planteando crear un índice no-clúster para el número de teléfono.

Nuestra tabla sería la siguiente:

image

Esta tabla tiene un millón de socios (pongamos que es un gimnasio con mucho éxito), y el tamaño de la tabla observamos que es:

image

Si creamos el índice no clusterizado, utilizando la constraint unique, vemos que ocupa:

image

Veamos cómo es la estructura de este índice no clúster:

En el nivel inferior, cada línea tendrá:

-El número de teléfono, de tipo char(9) que ocupará 9 bytes

-El puntero a la página donde se encuentra el dato, 6 bytes

-Un overhead de 2 bytes

Por lo tanto, tendremos 17 bytes en cada entrada. Además por cada una de ellas, necesitaremos dos bytes en el slot array (https://blogs.msdn.com/b/askjay/archive/2011/01/07/what-is-a-slot-array.aspx). En total, 19 bytes.

En cada página, tenemos disponibles 8096 bytes (8K de página menos el overhead), por lo que en cada página del último nivel, podemos incluir (8096/19)= 426 entradas. Como tenemos un millón de registros, necesitaremos (1000000/506=2347,41), como necesitamos un número entero de páginas: 2348.

Hay que tener en cuenta que este número de páginas indica tan sólo el número de páginas en el nivel inferior. A continuación, existiría otro nivel que en lugar de referenciar la página donde está el dato, referencia la página del nivel inferior. Y por último, el nivel raíz, que apunta a este nivel intermedio.