You are on page 1of 34

NDICES EN SQL

SERVER
Montes de Oca Vizcarra
Que es un ndice?
Un ndice es una estructura de datos que permite acceder
a diferentes filas de una misma tabla a travs de un
campo (o campos clave).

Un ndice permite un acceso mucho ms rpido a los
datos.

Para entender lo que es un ndice debemos saber
primero como se almacena la informacin internamente
en las tablas de una base de datos.

Cada tabla se divide en pginas de datos, imaginemos un
libro, podramos escribirlo en "una sola hoja enorme" al
estilo pergamino egipcio, o bien en pginas a las que
podemos acceder rpidamente a travs de un ndice.
Est idea es la que se aplica en el mundo de las bases
de datos, la informacin esta guardada en una tabla (el
libro) que tiene muchas hojas de datos (las pginas del
libro), con un ndice en el que podemos buscar la
informacin que nos interesa.
Si queremos buscar la palabra zapato en un diccionario ,
qu hacemos?
Leemos todo el diccionario hasta encontrar la palabra, con lo que
nos habremos ledo el diccionario enterito Buscamos en el
ndice en que pgina est la letra z, y es en esa pgina donde
buscamos.

Veamos un ejemplo con nuestro ejercicio:
Esta tabla no tiene ningn ndice creado, por lo cual SQL
Server tratar la tabla como un HEAP.

Puesto que esta tabla no tiene ningn tipo de ndice, es
bastante eficiente para agregar nuevas filas a la tabla
pero muy ineficiente para encontrar una fila especfica,
esto se debe a que es necesario leer toda la tabla para
obtener el resultado deseado.

(HEAP)
Un HEAP es un montn en espaol.


Un heap es una estructura de datos que almacena la posicin fsica en
la que se almacen cada nueva fila dentro de las pginas asignadas a la
tabla.
(HEAP)
Los recorridos de tablas o las lecturas secuenciales de
un montn se hacen recorriendo las pginas IAM para
buscar las extensiones que almacenan las pginas de
dicho montn.

Como la IAM representa las extensiones en el mismo
orden en el que se encuentran en los archivos de datos,
ello significa que los recorridos secuenciales de un
montn recorren secuencialmente cada archivo. Utilizar
las pginas IAM para establecer la secuencia de
recorrido tambin significa que las filas del montn no se
devuelven normalmente en el orden en que se
introdujeron.
Que es un ndice?
Que es un ndice?
Los ndices se actualizan automticamente cuando
realizamos operaciones de escritura en la base de datos.

Este es un aspecto muy importante de cara al
rendimiento de las operaciones de escritura, ya que
adems de escribir los datos en la tabla se escribirn
tambin en el ndice.

Las claves primarias son ndices.

Los nombres de los ndices deben ser nicos.

Que es un ndice?
Un nmero elevado de ndices har ms lentas estas
operaciones. Sin embargo, salvo casos excepcionales, el
beneficio que aportan los ndices compensa (de largo)
esta penalizacin.
Que es un ndice?
Las sentencias de SQL para manipular ndices son:

CREATE INDEX;

DROP INDEX;

Que es un ndice?
La sintaxis para la creacin de ndices es la siguiente:

CREATE [UNIQUE] INDEX <nombre_indice>
ON <nombre_tabla>(
<nombre_campo> [ASC | DESC]
{,<nombre_campo> [ASC | DESC]})
);

La plabra clave UNIQUE especifica que no pueden existir
claves duplicadas en el ndice.
ASC | DESC especifican el criterio de ordenacin elegido,
ascendente o descendente, por defecto es ascendente.

Ejemplo
Creamos la tabla Cementerio, este ejemplo crea un
ndice nico en el campo IDCementerio. Esto nos
permitir buscar mucho mas rpido por el campo
IDCementerio y nos asegurar que no tengamos dos
IDCementerio iguales.

CREATE UNIQUE INDEX UIX_CEMENTERIO_
IDCementerio
ON CEMENTERIO (IDCementerio);

Ejemplo
Para eliminar un ndice debemos emplear la sentencia
DROP INDEX.

DROP INDEX <nombre_tabla>.<nombre_indice>;

Ejemplo: Para eliminar el ndice creado anteriormente.

DROP INDEX CEMENTERIO.UIX_CEMENTERIO_
IDCementerio;

ndices
Para obtener ms informacin sobre el acceso a los
datos requeridos para resolver la consulta ejecutamos la
siguiente consulta:
CHECKPOINT

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS
SET STATISTICS IO ON

Select * from Cementerio

SET STATISTICS IO OFF
ndices

Lo primero que pasa al ejecutar esta consulta es que SQL
Server escribe todos los cambios pendientes al disco, la
segunda instruccin elimina todos los datos que tiene en
memoria.


ndices

La combinacin de estas dos instrucciones obliga a SQL
Server a leer todo desde disco nuevamente

Es importante tener en cuenta que al ejecutar DBCC
DropCleanBuffers se produce un fuerte impacto en el
desempeo de todos los usuarios, por lo que no se debe
utilizar en servidores de produccin.
ndices

La tercera instruccin nos permite obtener informacin
sobre las lecturas de datos requeridas para contestar una
consulta. El resultado que se obtiene en el rea de
mensajes es:

Tabla 'Cementerio'. Nmero de exploraciones 1,
lecturas lgicas 0, lecturas fsicas 0, lecturas
anticipadas 0.
ndices
Para mejorar el desempeo de las consultas se utilizan
ndices, los ms utilizados son los Clustered y Non-
Clustered.

Existen otros 3 tipos de ndices que se utilizan para
mejorar los tiempos de acceso a datos XML, a bsquedas
de texto y de datos espaciales.

ndices
ndices
Los Clustered Indexes son ndices que controlan el
orden fsico de las filas en la tabla, por lo cual solo
puede existir uno para cada tabla.

Los Non-Clustered indexes son ndices que mantienen
un sub conjunto de las columnas de la tabla en
orden. Estos ndices no modifican el orden de las filas
de la tabla, en lugar de esto mantienen una lista
ordenada de referencias a filas de la tabla original.

ndices
Para ilustrar la diferencia entre estos 2 tipos de ndices
podemos decir que las pginas blancas de la gua
telefnica tienen un clustered index por Apellido(s) y
Nombres, con lo cual puedo buscar de forma muy
eficiente el nmero de telfono de una persona si
conozco sus apellidos y su nombre, una vez que lo
encuentro obtendr su nmero de telfono en forma
inmediata pues el numero est al lado del nombre.
ndices
En el caso de las pginas amarillas de la gua telefnica
la forma de buscar es un poco distinta, en este caso
busco por rubro. Primero busco en un ndice, el cual me
indica en qu pgina se encuentra la lista de empresas
que satisfacen la condicin que busco.

Esto mismo es lo que pasa cuando utilizo un ndice Non-
Clustered index una vez que encuentro lo que quiero en
el ndice debo ir a leer la fila especfica para obtener el
resto de los datos.
ndices

El clustered index controla el orden fsico de las filas
en la tabla, a diferencia de los ndices Non-Clustered
que funcionan como una lista ordenada de
identificadores de fila.
ndices
Todas las tablas que tienen un clustered index tienen un
nodo raz y muchos nodos en los niveles intermedios,
estos a su vez pueden apuntar a nodos hojas o a otros
nodos intermedios.

Esta estructura forma un rbol (B-Tree) que permite
encontrar cualquier fila en forma eficiente.
ndices
La bsqueda parte desde el nodo raz, este nodo tiene
una lista de llaves, se comparan estas llaves para
encontrar el nodo de nivel intermedio que contenga un
rango de llaves que cubra la llave que se est buscando.

Luego se repite el proceso en los nodos intermedios
hasta que se encuentre la pgina de datos que contenga
el la fila especfica.
ndices
Al igual que en el caso de los clustered index, los non-
clustered index tienen un nodo raz y muchos nodos en
los niveles intermedios, estos a su vez pueden apuntar a
nodos hojas o a otros nodos intermedios.

La diferencia se presenta en los nodos hoja, estos tienen
almacenados solo el Id del registro y no todo el registro,
por lo que se hacer necesario hacer una bsqueda sobre
el ndice cluster o sobre el heap para obtener el resto de
las columnas de la fila.
ndices
Como descubrir ndices faltantes
Cada vez que SQL ejecuta una consulta, internamente
determina si esa consulta poda haber sido optimizada
con el uso de algn ndice inexistente al momento del
query (por eso es missing index) y cuando ejecutemos
algunas de estas vistas dinmicas nos dar dicha
informacin.
Como descubrir ndices faltantes
sys.dm_db_missing_index_group_stats
Regresa informacin acerca de grupos de ndices no
existentes, por ejemplo, la performance que se podra obtener
implementando un grupo especfico de ndices.

ys.dm_db_missing_index_groups Regresar informacin
acerca de un grupo especfico de indices no declarados, como
el identificador de grupo y el identificador de todos los ndices
que estn contenidos en dicho grupo.
Como descubrir ndices faltantes
sys.dm_db_missing_index_details
devuelve informacin detallada acerca de un posible
ndice a ser creado, por ejemplo nombre e identificador
de la tabla donde el ndice podra ser creado y las
columnas y tipos que conformaran dicho ndice.
Como descubrir ndices faltantes
sys.dm_db_missing_index_columns
Devuelve info acerca de los campos que podran
conformar un ndice.that are missing an index.

You might also like