¿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:
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:
Si creamos el índice no clusterizado, utilizando la constraint unique, vemos que ocupa:
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.