sábado, 20 de junio de 2020

Ejemplos prácticos de Índices

Buenas tardes queridos lectores, el día de hoy realizaremos algunos ejemplos prácticos de creación de índices, pero no solo veremos la creación, sino también, como encontrar los índices faltantes, en base al plan de ejecución, primero veremos teoría y pasaremos a ejemplos prácticos. Para este ejemplo contamos con una base de datos de 7 millones de registros, pensando que sería una tabla sumamente transaccional, pero entremos en materia.



Índice: Una explicación común es que un índice sirve para "acelerar" las consultas SQL SERVER, lo cual básicamente es correcto, para eso sirve, pero veremos detalles técnicos mas específicos

Un índice es una estructura de disco asociada con una tabla o una vista que acelera la recuperación de filas de la tabla o de la vista. Un índice contiene claves generadas a partir de una o varias columnas de la tabla o la vista. Dichas claves están almacenadas en una estructura (árbol b) que permite que SQL Server busque de forma rápida y eficiente la fila o filas asociadas a los valores de cada clave. Esta es la explicación según Microsoft.


Sin embargo, podemos decir que un índice es como el índice de un libro, el índice de un libro sirve para buscar capítulos específicos sin tener que buscar en todo el libro, el índice nos dirá la página exacta del capitulo que queremos y bastará con ir a esa página sin buscar página por página en el libro, dicho de otra manera, funciona como un directorio telefónico, lleno de nombres, direcciones y teléfonos, si buscamos un nombre en particular, buscaremos por orden alfabético, si el nombre empieza con Z, no buscaremos en ninguna letra, que no sea la Z, de manera que no tendremos que buscar página por página, nombre por nombre, hasta encontrar el que queremos, es por eso que las consultas se aceleran al utilizar índices.

Existen diferentes tipos de índices, sin embargo, no serán tratados en este artículo

Plan de ejecución: Un plan de ejecución básicamente es el camino más corto que el motor considera que debe seguir para mostrar el resultado. Si es una instrucción SELECT, el plan de ejecución hará uso de las estadísticas, índices, particiones, etc., para elegir la mejor opción, además de esto, podrá sugerirnos algunos índices para acelerar las consultas.

Ejemplo 1: Correr una consulta activando el plan de ejecución para mostrar índices sugeridos.

Tenemos una tabla con mas de 7 millones de registros, primero realizaremos un SELECT a toda la tabla de la siguiente manera:


Como podemos apreciar, la consulta tardó 1:23 seg, parece poco tiempo considerando los 7 millones de registros, pero en una tabla de operaciones real, ese sería demasiado tiempo, serían muy lentas las consultas y no sería optimo su funcionamiento. Podemos pensar "Le ponemos un Where y de esa manera reducimos los registros", esto es correcto, pero tienen que utilizarse los índices, vamos a correrlo con el Where para comprobar lo que les digo.


Como ven, ahora el tiempo fue de 15 seg, para 702 mil registros, nada mal ¡EH!, sin embargo 15 segundo siguen siendo demasiados, vamos a visualizar el plan de ejecución para saber si hay indices sugeridos.


Como vemos el plan de ejecución nos sugiere crear un índice, al colocar el mouse encima del texto verde, saldrá el código para generar el índice, solo hay que crearlo.

Ejemplo 2: Crear un índice sobre la tabla, para acelerar la ejecución de la sentencia SELECT, tomando como base el índice sugerido por el plan de ejecución

create index dba_mytable on mytable (ciudad) include (id, nombres, direccion, pais)

Tardará un momento en crearlo, ya que el índice ocupa espacio en disco además de realizar algunas cosas más, que lo veremos más adelante. Ahora, ejecutaremos la consulta nuevamente, aquella que tardaba 15 segundos y veremos el resultado:
select * from [myTable]
where ciudad = 'Neuruppin'


Como vemos, la consulta tardó únicamente 8 segundos, de los 15 que tardaba con el WHERE, pero que tiene de distinto el WHERE y el índice, pues bien. El Where recorre toda la tabla y muestra en pantalla únicamente los registros que mencionamos en el WHERE, en el caso del índice, ordena en orden alfabético el campo, en este caso Ciudad y busca únicamente los registros que contenga esa ciudad y los demás los ignora. Ahora si realizamos una consulta a toda la tabla

select * from [myTable]


Como ven, el tiempo de ejecución fue de 01:20 seg, prácticamente el mismo que sin índices, esto es porque al realizar un SELECT sin WHERE invalida el índice, sin embargo, podemos notar que el campo Ciudad esta ordenado de manera alfabética ascendente, si nos fijamos en el campo myTableID, vamos como no aparecen en el orden que se ingresaron, debido al índice.

Hasta aquí el post, espero que haya sido de utilidad. Cualquier duda comenten, compartan, les pido den clic a algún anuncio de su interés, eso me ayudaría mucho.

Saludos

Referencias

No hay comentarios.:

Publicar un comentario

Roles en SQL SERVER

Buenas tardes queridos lectores, ya poco a poco va pasando la cuarentena y empiezan a abrir todo, el día de hoy, les traigo el post de los ...