«Las estadísticas para la optimización de consulta son objetos que contienen información estadística acerca de la distribución de valores en una o más columnas de una tabla o vista indizada. El optimizador de consultas utiliza estas estadísticas para estimar la cardinalidad, o número de filas, en el resultado de la consulta. Estas estimaciones de cardinalidad habilitan al optimizador de consultas para crear un plan de consulta de alta calidad. Por ejemplo, el optimizador de consultas podría utilizar las estimaciones de cardinalidad para elegir el operador Index Seek en lugar del operador Index Scan, con un uso más intensivo de los recursos, mejorando con ello el rendimiento de la consulta» (texto extraído de MSDN).
O sea, las estadísticas son fundamentales para la rápida obtención de la información en SQL Server, por lo tanto, es conveniente tenerlas actualizadas.
En nuestros proyectos algunas veces tuvimos que forzar la actualización de las estadísticas para mejorar los tiempos de ejecución en las consultas de nuestras aplicaciones, principalmente en tablas que tienen muchas modificaciones de datos. Para esto Transact-SQL nos provee el comando UPDATE STATISTICS, que nos permite actualizar las estadísticas de una tabla o vista. En caso que quisieramos actualizar las estadísticas de todas las tablas de una base de datos, podemos utilizar el procedimiento almacenado «sp_updatestats«. Pero si lo que queremos hacer es, por ejemplo, una tarea programada que actualice todas las tablas de todas las bases de datos de nuestro servidor de SQL Server, no tenemos un comando o procedimiento almacenado que nos permita esto. Por este motivo (ya que nosotros tuvimos que hacerlo para un cliente) creamos el siguiente script que realiza esta tarea.
DECLARE @SQL VARCHAR(1000) DECLARE @DB sysname --Creo un cursor para consultar el nombre de todas las bases de datos, excepto las de sistema DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR SELECT [name] FROM sys.databases WHERE state = 0 AND Name NOT IN ('master','model','msdb','tempdb') ORDER BY [name] --Abro el cursor y por cada base ejecuto el stored procedure que actualiza las estadísticas OPEN curDB FETCH NEXT FROM curDB INTO @DB WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = 'USE [' + @DB +']' + CHAR(13) + 'EXEC sp_updatestats' + CHAR(13) PRINT @SQL EXEC (@SQL) FETCH NEXT FROM curDB INTO @DB END --Cierro y elimino el cursor CLOSE curDB DEALLOCATE curDB
Espero que este script les sea de utilidad.
Suerte!