You are on page 1of 34

Roco Contreras guila Primer Semestre 2010

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.

Que es un ndice?
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.

Que es 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.

Que es un ndice?
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 (seguro que aprenderamos un montn!) Buscamos en el ndice en que pgina est la letra z, y es en esa pgina donde buscamos.

Que es un ndice?
Veamos un ejemplo con nuestro ejercicio:

Que es un ndice?
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 NonClustered.


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 NonClustered 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