segunda-feira, 15 de dezembro de 2014

Tarefa de INDEX REBUILD no SQL AZURE

A partir da semana passada comecei a migração do banco de dados da Amazon RDS para Microsoft SQL Azure. Após a migração da estrutura do banco e alguns dados básicos para o teste (não estamos em produção ainda), precisei resolver algumas limitações do SQL Azure e um deles é a falta de SQL JOBS.

Para realizar um trabalho INDEX REBUILD, eu tive que usar as TAREFAS AUTOMATIZADAS do Microsoft Azure, usando um script baseado em PowerShell.

Este é o rascunho do que eu fiz:

workflow IndexRebuild 

     
    inlinescript { 
        # Define the connection to the SQL Database
        $server = "informeURLSQLAzure" 
        $db     = "informeNomedoBanco"
        $usr    = "informeUsuarioBanco"
        $psw    = "informeSenhaBanco"

        $Conn = New-Object System.Data.SqlClient.SqlConnection("Server=$server;Database=$db;User ID=$usr;Password=$psw;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;") 
         
        # Open the SQL connection 
        $Conn.Open() 

        # Here you can add your defrag proc... I added one bellow... 
        $Cmd=new-object system.Data.SqlClient.SqlCommand("Exec SpDefragAllIndex;", $Conn) 
        $Cmd.CommandTimeout=120 

        # Execute the SQL command 
        $Ds=New-Object system.Data.DataSet 
        $Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd) 
        [void]$Da.fill($Ds) 

        # Output the count 
        $Ds.Tables.Column1 

        # Close the SQL connection 
        $Conn.Close() 
    } 
}

O script acima é apenas para a tarefa. Abaixo o script da procedure de REBUILD que estou usando no AZURE:

ALTER PROC Spdefragallindex 
AS 
  BEGIN 
      DECLARE @TableName VARCHAR(255) 
      DECLARE tablecursor CURSOR FOR 
        (SELECT '[' + IST.table_schema + '].[' + IST.table_name 
                + ']' AS [TableName] 
         FROM   information_schema.tables IST 
         WHERE  IST.table_type = 'BASE TABLE') 

      OPEN tablecursor 

      FETCH next FROM tablecursor INTO @TableName 

      WHILE @@FETCH_STATUS = 0 
        BEGIN 
            PRINT( 'Rebuilding Indexes on ' + @TableName ) 

            BEGIN try 
                EXEC('ALTER INDEX ALL ON ' + @TableName + 
                ' REBUILD with (ONLINE=ON)') 
            --PRINT 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD with (ONLINE=ON)' 
            END try 

            BEGIN catch 
                PRINT( 'Rebuild with Online=On ' + @TableName 
                       + ' UnSuccessful, removing ONLINE' ) 

                EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD') 
            END catch 

            FETCH next FROM tablecursor INTO @TableName 
        END 

      CLOSE tablecursor 

      DEALLOCATE tablecursor 

      SELECT Cast(1 AS INT) AS [Success] 
  END 

Como não estamos em produção ainda, não estou usando uma lista de tabelas baseado no tamanho ou na média de fragmentação, o que seria mais adequado. Altere a procedure como for melhor a sua necessidade.

Check out my new book on MariaDB http://www.amazon.com/dp/B00MQC06HC

Nenhum comentário:

Postar um comentário

Leave your comment here!