martes, 27 de junio de 2017

Índices en SQL Server - 2 de 2



Ejemplo para calcular de forma teorica el tamaño que puede ocupar un indice en una tabla:

Tenemos una Tabla con 10000 PAGINAS Y 50000 FILAS

Queremos hacer un indice a partir de una tabla en la que cada tipo de dato en la columna de tiene un tamaño fijo de 5 bytes. Por ejemplo varchar(5).
CREAR CLAVE AGRUPADA 5 BYTES LONGITUD FIJA

La Hoja del indice ocupará 12 bytes porque el índice incluye información adicional, una clave interna y unica para cada dato que tiene el indice. 
Dependiendo del dato, añade de 5 a 8 bytes más en cada página de indice.
Ahora sabemos cuantas filas ocupan y el tamaño de cada página.

Cada página de indice tiene un tamaño fijo de 8096 bytes.
Cada fila del indice ocupa 12 bytes.
Haciendo este cálculo, sabemos cuantas filas de datos va a contener cada página de indice.

8096 bytes / 12 bytes = 674 filas en cada indice, en el momento que pongamos 675 datos, la página se dividirá.

Cada una de las páginas va a generar una fila en las páginas de indice, habrá que dividir las 10000 páginas por las 674 filas y sabremos cuantas páginas de indices hay.

10000 páginas / 674 Filas = 15 páginas

Nivel de hoja de datos:
10000 páginas

Nivel del indice: 15 Paginas

Se va a generar otro nivel que es nivel 2 que es raiz, porque el nivel raiz solamente va a tener 15 filas, pero tiene espacio para 674.

Nuestro archivo de datos se configura asi, si tenemos 10000 páginas y dividimos por 16 páginas de indice, sale un 1 por ciento que ocupa de espacio el indice, a partir de 3% se supera el limite de coste de un indice, entonces hay que plantearse si se deben utilizar indices en la tabla o no.

2. Índices No Agrupados:
  • Si se insertan filas después de generarse los índices, se inserta al final y no están incluidos en los índices.
  • Almacena todas las filas desordenadas, con un orden en el indice.
  • Posteriormente crea los índices que contienen un puntero (identificador unico) que indica en que página de datos y que fila está cada registro. Por encima de estos hay otros índices que contie nen la cabecera de cada uno de ellos y por encima queda un único índice llamado raiz que contiene la cabecera de cada indice inferior. La búsqueda se realizará internamente por este identificador único.
  • Lo bueno que tiene este indice es que sabe cuantos saltos debe dar para ir a las consultas, sabe exactamente cuantos valores va a devolver.
  • Es mejor utilizar indices no agrupados en las tablas que sufran muchas modificaciones, inserciones y borrado de datos, debido a la fragmentación de los datos.
  • Los datos borrados se llaman datos fantasma, estos datos permanecen en las hojas de indice un tiempo, cada cierto periodo son eliminados, el ordenador lo hace automaticamente.
  • Los indices no agrupados corresponderían a una especie de glosario, donde buscamos unas palabras en un libro y nos muestra las páginas donde estan situadas dichas palabras.


- Sirven para buscar valores en otras columnas que no estén agrup adas por ningún
tipo de indices.
- Se pueden crear tantos indices no agrupados como se deseen, pero solamente puede haber un único indice agrupado.

Select oficio from emp where dni = 7

Oficio es un campo de la tabla que no tiene indice, pero el campo DNI sí que tiene un índice no agrupado.
Para esta consulta, la búsqueda comenzaria por el indice no agrupado, iría buscando por el DNI hasta encontrar la ruta para llegar al índice agrupado, dónde se realizaría la búsqueda por el campo apellido para llegar más rápido al dato que buscamos. Una vez encontrado el dato en las páginas de datos, se devuelve el campo oficio. 

Elegir el tipo de índices a usar

Todos los indices se almacenan en la tabla Sysindexes.

use master
go
select * from sysindexes



La columna id, identifica el indice en la tabla.
La columna INDID, establece el tipo de indice que es:
  • 1 Agrupado
  • 2 – 255 No agrupado
  • 0 Es un valor que almacena para las Primary Key.
Selectividad = Nº total de filas – nº de filas devueltas.
Si tenemos muchos datos duplicados hay una alta densidad
Si tenemos pocos datos duplicados hay baja densidad


Espero haber ayudado en algo. Hasta la próxima oportunidad!












  

No hay comentarios:

Publicar un comentario

       
free counters

Páginas vistas en total según Google