Hay una nueva información que SQL Server proporciona, desde la versión de SQL Server 2005 en adelante, se llama Missing Indexes. Cuando el Optimizador esta optimizando la consulta, puede indicarnos, si a esa consulta le falta o se beneficiaría de algún índice. El Optimizador proporciona esta información y la deja disponible en el plan de ejecución.
Es aconsejable para el buen entendimiento de este “Tema:IV” que se lea o repase los enlaces: Query Optimizer. Parameter Sniffing. SQL Server. Tema: I y el enlace: Query Optimizer. Cardinality Estimation Error. SQL Server. Tema: II
Una advertencia obligada, es que veamos y utilicemos la información proporcionada por Missing Indexes, pero no siempre sigamos las indicaciones que nos proporciona. Básicamente, cuando nosotros nos encontremos con estas advertencias, hemos de pensar que QUIZAS tengamos un problema donde se nos indica. Pero no siempre es la mejor opción implementarla. Nosotros seremos quien tomemos la decisión de crear o no, ese índice.
Hay una pequeña limitación de Missing Indexes, ya que no funcionaría cuando tenemos un plan de ejecución denominado como Trivial. Normalmente no nos tenemos que preocupar por este tipo de planes, pues casi todas las consultas que tenemos en nuestros servidores de producción, serán mas complicadas y no serán un plan trivial.
Como plan trivial entenedemos: si presentamos una consulta simple (por ejemplo, en consultas sobre una sola tabla sin índices y sin campos agregados o cálculos) que en lugar de perder tiempo tratando de calcular el plan óptimo, el Optimizador simplemente aplicará un único plan trivial para ese tipo de consultas. Una forma simple de evitar estos planes triviales es creándonos un índice en la tabla que no tenga nada que ver con nuestra consulta, después estudiar nuestros plan de ejecución con los Missing Indexes sugeridos si los hubiere, y finalmente eliminar ese índice.
Si la consulta no es trivial, el Optimizador llevará a cabo un cálculo basado en las estadísticas, y gracias a estas, hará una estimación de los registros a devolver por la consulta, punto de partida para iniciar la creación del plan de ejecución de la consulta.
Ahora bien, si nos fijamos en un plan de ejecución gráfico, podemos encontrar el Missing Index, como muestro en un ejemplo:
Si pinchamos sobre el, con el botón derecho del ratón y seleccionamos “Missing Index Detail”, se nos mostrará el comando a ejecutar o la sentencia CREATE exacta del índice que se nos aconseja crear.
Tendremos que valorar, o las reglas de negocio de nuestra empresa, cuan critica o importante es la consulta, para invertir tiempo y recursos en optimizar la consulta y conseguir que el tiempo de su respuesta sea el mínimo posible. Partiendo de esto, podremos probar los consejos de crear nuevos índices y verificar si efectivamente las consultas devuelven los datos con mayor rapidez.
No es aconsejable cargar las tablas de índices, pues cuanto mas se tengan en una tabla, habrá operaciones que se verán afectadas y tarden mas, por poner un ejemplo, cuando se hacen inserciones sobre registros o campos índice, estos índices se han de actualizar en memoria, lo que conlleva un coste, imagina que tienes cientos de inserciones en una hora, lo que puede afectar al rendimiento… Tenemos que tratar de tener siempre los mínimos índices indispensables en nuestras tablas, y que estos sean los correctos, y asegurarnos que los usan aquellos planes de ejecución de las consultas de la aplicación que los necesiten.
Se aconseja leer: Actualización de estadísticas síncronas o asíncronas mejoran la respuesta del optimizador de consultas. SQL Server
Fuentes:
Microsoft, MSDN, Benjamin Nevares
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.