ATENÇÃO DEVIDO A UMA ADAPTAÇÃO DECIDI RESCREVER O SCRIPT.

AGORA O SCRIPT GERA TEXTO COM O SCRIPT PARA MANUTENÇÃO NA INSTANCIA CORRENTE

PARA QUEM NÃO ENTENDEU É SÓ COPIAR E COLAR O SCRIPT NO SQL SERVER MANAGEMENT STUDIO.

SE GOSTAR PODE DEPOSITAR UMA GRANA NA MINHA CONTA.

Vamos que vamos......

Este script veio direto (((( https://msdn.microsoft.com/pt-br/library/ms188917(v=sql.120).aspx  ))))

Procurando por fragmentacao você certamente vai acabar neste link, então valei o conselho não reinventar a roda, utilize este script e pronto.

Mas vamos atentar para o seguintes fatos :

Este script executa as acoes no banco e  gera uma listagem com o que foi realizado, só que não apresenta o percentual da fragmentação .

Por isso eu alterei o script para ter a informação do tamanho da fragmentação.

Caso você queira fazer um relatório, uma estatística, sei la você poderá armazenar as informações em uma tabela temporária tipo :

SELECT * INTO #antes FROM sys.dm_db_index_physical_stats(DB_ID(N'<<<< SEU BANQUINHO >>>>') ,null, NULL, NULL , 'detailed'); 

e depois de rodar o script gerado.

SELECT * INTO #depois FROM sys.dm_db_index_physical_stats(DB_ID(N'<<<< SEU BANQUINHO >>>>') ,null, NULL, NULL , 'detailed'); 

ai e só fazer o join e pronto tem la o antes e depois.

 

Agora se você  esta com pouca paciência para continuar lendo então copia o script abaixo cole no Management Studio e seja feliz.

 use master

DECLARE @nome_banco varchar(50)

DECLARE lista CURSOR SCROLL FOR select name from master..sysdatabases order by name

OPEN lista

-- Primeiro registro

FETCH FIRST FROM lista INTO @nome_banco

 WHILE @@FETCH_STATUS = 0

BEGIN

print '

-- ** INICIO DESFRAGMENTACAO BANCO '+ @nome_banco +' 

use '+ @nome_banco +'   

SET NOCOUNT ON;

DECLARE @objectid int; SET @objectid = DB_ID(N'+CHAR(39)+@nome_banco+CHAR(39)+')

DECLARE @indexid int;

DECLARE @partitioncount bigint;

DECLARE @schemaname nvarchar(130); 

DECLARE @objectname nvarchar(130); 

DECLARE @indexname nvarchar(130); 

DECLARE @partitionnum bigint;

DECLARE @partitions bigint;

DECLARE @frag float;

DECLARE @command nvarchar(4000); 

-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function 

-- and convert object and index IDs to names.

SELECT

    object_id AS objectid,

    index_id AS indexid,

    partition_number AS partitionnum,

    avg_fragmentation_in_percent AS frag

INTO #work_to_do

FROM sys.dm_db_index_physical_stats (@objectid, NULL, NULL , NULL,  '+CHAR(39)+'LIMITED'+CHAR(39)+')

WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

-- Declare the cursor for the list of partitions to be processed.

DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;

-- Open the cursor.

OPEN partitions;

-- Loop through the partitions.

WHILE (1=1)

    BEGIN;

        FETCH NEXT

           FROM partitions

           INTO @objectid, @indexid, @partitionnum, @frag;

        IF @@FETCH_STATUS < 0 BREAK;

        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)

        FROM sys.objects AS o

        JOIN sys.schemas as s ON s.schema_id = o.schema_id

        WHERE o.object_id = @objectid;

        SELECT @indexname = QUOTENAME(name)

        FROM sys.indexes

        WHERE  object_id = @objectid AND index_id = @indexid;

        SELECT @partitioncount = count (*)

        FROM sys.partitions

        WHERE object_id = @objectid AND index_id = @indexid;

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.

        IF @frag < 30.0

            SET @command = N'+CHAR(39)+'ALTER INDEX '+CHAR(39)+' + @indexname + N'+CHAR(39)+' ON '+CHAR(39)+' + @schemaname + N'+CHAR(39)+'.'+CHAR(39)+' + @objectname + N'+CHAR(39)+' REORGANIZE'+CHAR(39)+';

        IF @frag >= 30.0

            SET @command = N'+CHAR(39)+'ALTER INDEX '+CHAR(39)+' + @indexname + N'+CHAR(39)+' ON '+CHAR(39)+' + @schemaname + N'+CHAR(39)+'.'+CHAR(39)+' + @objectname + N'+CHAR(39)+' REBUILD'+CHAR(39)+';

        IF @partitioncount > 1

            SET @command = @command + N'+CHAR(39)+' PARTITION='+CHAR(39)+'+ CAST(@partitionnum AS nvarchar(10));

        EXEC (@command);

        PRINT N'+CHAR(39)+'Executed: '+CHAR(39)+' + @command;

    END;

-- Close and deallocate the cursor.

CLOSE partitions;

DEALLOCATE partitions;

-- Drop the temporary table.

DROP TABLE #work_to_do;

GO

-- ** FIM DESFRAGMENTACAO BANCO '+ @nome_banco +' 

-- **********************************************************************************************  --

 

'

 

 -- Próximo registro

FETCH NEXT FROM lista INTO @nome_banco

END

 CLOSE lista

DEALLOCATE lista