Twitter Facebook RSS Feed

jueves, 09 de julio de 2015 a las 21:27hs por Gustavo Cantero (The Wolf)

«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).Query SQL
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!

3 comentarios »

  1. Me ha venido de perlas. Gracias

  2. brayan dice:

    Cada cuanto es Recomendable Actualizar las estadísticas?
    Y leyendo me di cuenta que es malo limpiar los planes de ejecución con DBCC DROPCLEANBUFFERS
    GO

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.