Cambios importantes en la actualización de estadísticas de 2016


SQL Server 2016 entre uno de sus tantos enormes cambios nos trajo a los DBA una modificación en el calculo y método con el cual se actualizan las estadísticas en nuestras bases de datos.

En versiones anteriores a SQL Server las estadísticas se actualizaban cuando los datos cambiaban en un 20% promedio lo cual generaba un disparador para poder actualizarlas, ahora bien todos sabemos que el 20% de una tabla de 1000 registros es una cosa pero de una de cientos de millones es otra, entonces lo que nos sucedía en estas tablas grandes es que teníamos que esperar mucho para que se actualicen de forma automática mas allá de nuestro plan de mantenimiento que nos podía ayudar.

A partir de SQL Server 2008 R2 SP1 se puede implementar para resolver este problema el trace Flag 2371 el cual cambia la forma de actualizar las estadísticas y dependiendo del tamaño de la tabla va decreciendo ese porcentaje.

Ahora bien, en SQL Server 2016 ya no sera necesario implementar el TF2371 ya que por defecto la nueva versión del motor incorpora el cambio de algoritmo en la actualización cuando la base tiene el modo de compatibilidad 130

Ejemplo Old statistics

Primero mostramos cual es el esquema viejo de actualización con el siguiente ejemplo:

Vamos a ver las estadísticas

capture_stat1

Ahora borramos unos 12.000 registros de los 100.000 lo cual representa menos del 20% y volvemos a ver la estadísticas

capture_stat1

Observamos las estadísticas y veremos que por mas que se hayan borrado 12.000 registros las estadísticas siguen indicando que los indices tienen 100.000, esto es porque hasta que no se modifiquen un 20% no se disparara la actualización automática de estadísticas.

Ejemplo estadísticas SQL 2016

Ahora lo que haremos es repetir el ejemplo anterior pero con la base en modo 130 (SQL 2016).

Vemos las estadísticas

capture_stat1

Ahora borramos unos 12.000 registros de los 100.000 lo cual representa menos del 20% y volvemos a ver la estadísticas

Si preguntamos nuevamente la estadistica veremos que no se actualizo, esto se debe que para que el patron lo tome (se dispare la actualizacion automatica) es necesario ejecutar una consulta que use alguno de los indices en cuestion como por ejemplo:

capture_stats2

Aquí  podemos observar que para el indice Ix2 se actualizo la estadística donde ahora me indica que hay 88.000 registros.

Resumen

La actualización de estadísticas es una función fundamental para que nuestros procesos luego funcionen de forma optima ya que en base a estas se determinan los planes de ejecución, si bien se podía cambiar a partir de SQL 2008 R2 sp1 el patrón de actualización ahora SQL Server 2016 ya lo tiene incorporado sin necesidades de implementar TF