SQL08: Actualització estadístiques de taula de forma dinàmica en tota una base de dades

Igual que en Oracle hi ha una taula on es llisten totes les taules de la base de dades (dba_tables) i podem utilitzar per realitzar operacions de manteniment de forma dinàmica, en Sql Server podem fer el mateix consultant la taula [basededades].dbo.sysobjects.

En l'exemple inferior (com en altres que he penjat) actualitzo les estadístiques de totes les taules d'una base de dades de Sql Server de forma dinàmica consultant el diccionari de dades. Aquest es podria encapsular en un stored procedure o directament executar en un job l'Agent de Sql Server per mantenir actualitzades les estadístiques de totes les taules d'una base de dades de forma automàtica.

-- Declaració de variables
    DECLARE @dbName    sysname
    DECLARE @sample int
    DECLARE @SQL nvarchar(4000)
    DECLARE @ID int
    DECLARE @Taula sysname
    DECLARE @RowCnt int

    -- Filtre per base de dades i percentatge per recalculi d'estadístiques 
    SET @dbName = 'AdventureWorks2008'
    SET @sample = 100

   --Taula temporal
    CREATE TABLE ##Taules
    (
     TableID INT IDENTITY(1, 1) NOT NULL,
     TableName SYSNAME NOT NULL
    )

    --Aliments la taula amb la llista de taules
    SET @SQL = ''
    SET @SQL = @SQL + 'INSERT INTO ##Taules (TableName) '
    SET @SQL = @SQL + 'SELECT [name] FROM ' + @dbName + '.dbo.sysobjects WHERE xtype = ''U'' AND [name] <> ''dtproperties'''

    EXEC sp_executesql @statement = @SQL

    SELECT TOP 1 @ID = TableID, @Taula = TableName
    FROM ##Taules
    ORDER BY TableID

    SET @RowCnt = @@ROWCOUNT
   
    -- Per cada taula

    WHILE @RowCnt <> 0
    BEGIN

     SET @SQL = 'UPDATE STATISTICS ' + @dbname + '.dbo.[' + @Taula + '] WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT'

     EXEC sp_executesql @statement = @SQL

     SELECT TOP 1 @ID = TableID, @Taula = TableName
     FROM ##Taules
     WHERE TableID > @ID
     ORDER BY TableID

     SET @RowCnt = @@ROWCOUNT

    END

   --Eliminen la taula
     DROP TABLE ##Taules