Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Qué es un índice.
Un índice consiste en una estructura de punteros a registros o grupos de
registros asociados a una tabla. Esta estructura contiene claves asociadas a
una o varias columnas de la tabla. La organización de estos punteros a los
datos se realiza de manera que se reduzcan Ias búsquedas cuando éstas sean
necesarias, distingue los diferentes métodos de indexación. Un índice resulta
más eficiente cuantas menos comprobaciones sobre la estructura deba realizar
para encontrar un registro.
Los registros de la tabla tienen un tamaño fijo y se almacenan en ficheros, de
manera que cada registro queda perfectamente determinado por su posición en
el fichero. De esta forma los punteros a los datos que se almacenan en los
índices no contienen más que la posición de estos registros en el fichero.
SQL Server almacena los índices como un objeto más de la base de datos. Los
objetos de SQL Server se almacenan en un modelo orientado a la página y no
al registro, la indexación no se lleva a cabo en ese modelo de puntero fijo, en
este modo de almacenamiento, los índices se almacenan en páginas
separadas, dentro de la misma base de datos.
Por qué crear índices.
La existencia de índices supone mejoras en la búsqueda de registros. Si
deseamos buscar una palabra en todo un libro puede resultar lento y
engorroso, pero también la podemos buscar en el índice del libro en el cual nos
indicará en que página se encuentra y podremos encontrarla mucho más
rápidamente. Los índices en SQL Server funcionan de forma similar al ejemplo
descrito.
Esta analogía descrita se denomina unclustered, porque no ordena las
palabras físicamente en el libro. A pesar de su utilidad los índices conllevan
penalizaciones pues ocupan un cierto número de páginas que encarece el libro,
y si éste se actualiza añadiéndole, un nuevo capítulo, debe reorganizarse el
índice lo que supone un coste operacional adicional. Por tanto, la creación de
índices está sujeta a un cierto compromiso entre la rapidez y el tamaño
ocupado, así como su operatividad. Si el libro no va a cambiar (la tabla no se
actualiza) y todo lo que vamos a hacer es consultarlo (sólo van a existir
sentencias SELECT, el único coste es el papel (espacio en disco) y podremos
crear todos los índices que queramos (siempre que dispongamos de espacio
suficiente). Cuantos más índices, más rápido permitirá encontrar las palabras.
Pero los índices no sólo sirven en el caso de consultas, también tienen utilidad
en la actualización ya que, en ciertos casos, pueden acelerar las operaciones
de UPDATE y DELETE, porque el gestor normalmente debe realizar una
búsqueda de un registro antes de poder eliminarlo o actualizarlo. Una vez se ha
llevado a cabo la actualización, los índices deberán ser actualizados. Si el
coste de actualización, de índices es inferior a la mejora obtenida en la
búsqueda, el índice mejorará el rendimiento. Esto sucede si el número de
índices de la tabla no es muy alto.
Tipos de índice.
Existen dos modos de creación de un índice en SQL.
SQL Server clustered indexes.
Son índices que se reflejan en la ordenación física de los datos, en otras
palabras son índices que al generarse reordenan la tabla. Desde el punto de
vista del modelo relacional los registros de una tabla no tienen ningún tipo de
ordenación. Para que en una tabla los registros se ordenen de una cierta
manera, es necesario crear un índice de tipo clustered.
SQL Server unclustered indexes.
Opuesto al caso anterior, es posible definir un índice que sea estrictamente una
ordenación lógica de los datos, sin que se produzca después de su definición
ningún tipo de modificación de la ubicación física de los registros. Este tipo de
índices se denominan unclustered.
Si una tabla no posee ningún índice clustered, los datos se van añadiendo de
manera secuencial en la última página de datos asignada a la tabla. Esta forma
de almacenamiento aunque es la más sencilla es también muy poco eficiente a
la hora de acceder a la información. Para acceder a un registro, será preciso
recorrer todas las páginas de datos anteriores examinando cada uno de los
registros que se almacenan en ellas. Es por ello que es altamente
recomendable definir un índice clustered para cada una de las tablas de
nuestras bases de datos.
Los índices pueden o no ser únicos. En el primer caso, no se permite que
existan dos registros que tengan el mismo valor para las columnas que sirven
de clave para el índice.
Selectividad de los índices.
Un índice es más útil cuanto más selectivo sea. Entendemos por selectividad
de un índice la cantidad de acotamiento que produce en los registros y este
acotamiento es inversamente proporcional al número de registros que
comparten un mismo valor de las columnas clave del índice.
Por ejemplo, un índice único, como puede ser el creado a partir de un
identificador único en una tabla de clientes (el Nº de cliente), es muy selectivo.
Sin embargo, un índice creado por el nombre del cliente sería muy poco
selectivo, pues seguro que hay muchos clientes que se llaman igual.
La selectividad de un índice puede cambiar con los datos así, un índice que
pueda ser muy selectivo hoy, no lo sea en absoluto cuando se inserten
masivamente registros. SQL Server puede generar estadísticas de selectividad
y distribución de los índices, y las almacena en páginas especiales, que evalúa
el optimizador de consultas con el objetivo de determinar si es adecuado y
eficiente utilizarlo un determinado índice para responder a una cierta consulta.
Estas estadísticas se deben actualizar con frecuencia y es posible consultarlas
con el comando DBCC SHOW_STATISTICS
. https://msdn.microsoft.com/en-us/library/ms174384.aspx
Por ejemplo:
DBCC SHOW_STATISTICS ("DBO.tbExpedientes", pk_tbExpedientes);
GO
Muestra las estadísticas del índice pk_tbExpedientes de la tabla tbExpedientes
del propietario dbo.
Definición de índices.
Existen dos métodos para definir índices: explícitamente, utilizando el comando
CREATE INDEX
https://msdn.microsoft.com/es-es/library/ms188783(v=sql.120).asp
x
)
Estructura de los índices.
Árboles balanceados.
La estructura de los índices en SQL Server es una estructura es que
denominamos árbol balanceado o b-cree. Un árbol balanceado (b-tree),
organiza las búsquedas siguiendo una ramificación determinada a través de un
árbol en el que cada rama se conecta a otras dos o a un nodo terminal u boja.
En este tipo de árboles de búsqueda el camino seguido para encontrar un
registro nunca es más de un 145 % del camino óptimo.
Sobre el icono del índice, pulsando el botón derecho del ratón podemos ver
más detalles sobre el rendimiento.
Para interpretar la salida de la ejecución gráfica hay que tener en cuenta las
siguientes indicaciones.
-Cada nodo está relacionado con un nodo principal. Los nodos secundarios que
tienen el mismo nodo principal se dibujan en la misma columna. Pero, no todos
los nodos de la misma columna tienen porqué pertenecer necesariamente al
mismo nodo principal. Cada conexión con su nodo principal se representa a
través de reglas con puntas de flecha.
Estas son las principales salidas con las que podemos encontrarnos y su
interpretación.
Table Scan
Esto indica que el motor necesita leer completamente la tabla sin utilizar un
índice. En la mayor parte de las situaciones, su aparición indica que es
necesario crear un índice o reestructurarlo si ya existe. Aunque no siempre es
así, el motor siempre intenta predecir los costos de ejecución basados en
las estadísticas que va almacenando, si se estima que va ser más rápido leer
toda la tabla en vez de leer un índice, usará ese método. Esto suele suceder
con tablas con pocos datos y la consulta en cuestión no conlleva ningún filtro.
Similar a Table Scan y Clustered Index Scan, la diferencia es que éste utiliza un
índice Non-Clustered para recorrer la tabla. Muchas veces puede ser síntoma
de un mal uso de los índices, aunque también puede aparecer cuando usamos
las cláusulas ORDER BY, JOIN o GROUP BY.
Index Seek
Index seek, es igual que Clustered Index Seek, pero trabajará con un Índice
Non-Clustered.
Bookmark Lookup
Sort
Cuando el motor necesita ordenar un campo que no está indizado, por ejemplo
al aplicar ORDER BY, GROUP BY, TOP, etc. Cuando aparece hay que estar
atentos por si falta algún índice en alguna tabla, aunque no siempre es así, llenar
de índices la Base de Datos tampoco es recomendable. La necesidad de ejecutar
algunas consultas ocasionalmente no justifica la creación de otro índice más.
JOIN
Merge Join
Hash Join
Este tipo de JOIN es muy específico para grandes volúmenes de datos, sobre
todo si no están indizados. Si aparece en nuestra base de datos OLTP, es
indicativo de que funcionará mejor sobre diseños OLAP, así que si no estamos
trabajando con DATA WAREHOUSING, es muy poco probable que sea útil.
Hash Match
Stream Aggregate