Utilizar las estadísticas es algo muy importante para el Optimizador de Consultas, por que este toma la mayoría de las decisiones basándose en las estadísticas. Uno de los mayores problemas cuando optimizamos consultas, es por que no tenemos estadísticas o no se encuentran actualizadas. Voy a comentar, de una forma sencilla, como detectar problemas de estadísticas, que es lo que denominamos “Mala Estimación de la Cardinalidad”.
Es aconsejable para el buen entendimiento de este “Tema:II” sobre la Estimación de la Cardinalidad, que se lea o repase el enlace: Query Optimizer. Parameter Sniffing. SQL Server. Tema: I
Es fácil detectar problemas en la Estimación de la Cardinalidad, básicamente es suficiente con comparar el valor actual de registros con el valor estimado de registros en los planes de ejecución. La mejor forma de hacerlo es utilizando el comando:
SET STATISTICS PROFILE ON/OFF
Una vez detectado este problema, para solucionarlo, uno de los primeros pasos que podemos hacer es actualizar todas las estadísticas de la tabla que estamos consultando, por ejemplo de la forma:
UPDATE STATISTICS TABLA WITH FULLSCAN
Podemos encontrarnos, ante casos, en los cuales SQL Server no nos da soporte de (o no genera) estadísticas, como por ejemplo; cuando trabajamos con table variables, en este caso, si la consulta que utilizamos usa muchos registros, no es buena opción trabajar con table variables, sería recomendable para ese caso utilizar tablas temporales o incluso tablas normales ya que ambas tienen soporte de estadísticas.
En un plan de ejecución, lo que tenemos que mirar, para verificar que se esta haciendo un correcto uso de estadísticas, es el Numero Actual de Registros y el Numero Estimado de Registros:
![](http://www.fullblog.com.ar/blogs/microsoftsqlsecret/1303686787584982.jpg)
En el caso, de la anterior imagen, el Optimizador no esta tomando una buena decisión, ya que estima que va a devolver 36395.1 registros cuando en realidad lo que devolverá son solo 5 registros, para lo cual, lo mas seguro es que realice un Table Scan para devolver solo 5 registros.
Para ver esto de una forma más fácil, como hemos comentado, antes y después de la consulta ejecutamos:
SET STATISTICS PROFILE ON
GO
<Nuestra consulta>
GO
SET STATISTICS PROFILE OFF
GO
De esta forma podremos comparar el numero real frente al estimado de registros, y encontrar cual es el operador en el plan que nos esta dando esa mala estimación, viendo el campo StmtText. Muestro un ejemplo de cómo se vería:
![](http://www.fullblog.com.ar/blogs/microsoftsqlsecret/1303686965538876.jpg)
Para la anterior imagen, la tabla tiene 121317 registros, y vemos como estima que va a devolver 36395.1 registros, que sería el 30% de los registros totales, cuando en realidad va a devolver 5 registros. Esta mala estimación hace que el Optimizador de consultas genere un mal plan de ejecución para resolver la consulta.
Se aconseja leer: Actualización de estadísticas síncronas o asíncronas mejoran la respuesta del optimizador de consultas. SQL Server
Os dejo el enlace, para aquellos a quienes les interese es tema, donde se habla de:
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.