DBCC INDEXDEFRAG

SQL Server

24/01/2014

Olá galera!!!

Ao pesquisar sobre o INDEXDEFRAG, vi que muitos criticam e a maioria elogia, alguém já utilizou esta prática e teria alguma recomendação se devo ou não utilizá-la em uma tabela de movimentação?

Teria algum outro comando que realiza tipo uma desfragmentação do próprio banco de dados, para melhorar o seu desempenho?
Rafael Dantas

Rafael Dantas

Curtidas 0

Respostas

Fabrício Lima

Fabrício Lima

24/01/2014

Segue um script para fazer um REORGANIZE ou REBUILD dos índices.

Muito cuidado pois essa operação faz lock nas tabelas e enche o arquivo de log do SQL.

declare @Id int,@SQLString nvarchar(4000)

select identity(int,1,1) Id, 'ALTER INDEX ' + B.Name + ' ON ' + C.Name +
case when Avg_Fragmentation_In_Percent < 20 then ' REORGANIZE' else ' REBUILD' end Comando
INTO #Indices_Fragmentados
from sys.dm_db_index_physical_stats(db_id(),null,null,null,null) A
join sys.indexes B on a.object_id = B.Object_id and A.index_id = B.index_id
join sys.sysobjects C on C.id = B.Object_id
where avg_fragmentation_in_percent > 5
and Page_Count > 1000

WHILE exists (SELECT Id FROM #Indices_Fragmentados)
BEGIN
SELECT TOP 1 @Id = Id , @SQLString = Comando
FROM #Indices_Fragmentados

-- Realiza o REORGANIZE OU O REBUILD
EXECUTE sp_executesql @SQLString

DELETE FROM #Indices_Fragmentados
WHERE Id = @Id

END



Script mais complexo:
http://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
GOSTEI 0
Rafael Dantas

Rafael Dantas

24/01/2014

Obrigado amigo, mas como eu posso resolver o problema dos logs, ou realizar essa atividade sem que ocorra um problema posterior?

Segue um script para fazer um REORGANIZE ou REBUILD dos índices.

Muito cuidado pois essa operação faz lock nas tabelas e enche o arquivo de log do SQL.

declare @Id int,@SQLString nvarchar(4000)

select identity(int,1,1) Id, 'ALTER INDEX ' + B.Name + ' ON ' + C.Name +
case when Avg_Fragmentation_In_Percent < 20 then ' REORGANIZE' else ' REBUILD' end Comando
INTO #Indices_Fragmentados
from sys.dm_db_index_physical_stats(db_id(),null,null,null,null) A
join sys.indexes B on a.object_id = B.Object_id and A.index_id = B.index_id
join sys.sysobjects C on C.id = B.Object_id
where avg_fragmentation_in_percent > 5
and Page_Count > 1000

WHILE exists (SELECT Id FROM #Indices_Fragmentados)
BEGIN
SELECT TOP 1 @Id = Id , @SQLString = Comando
FROM #Indices_Fragmentados

-- Realiza o REORGANIZE OU O REBUILD
EXECUTE sp_executesql @SQLString

DELETE FROM #Indices_Fragmentados
WHERE Id = @Id

END



Script mais complexo:
http://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
GOSTEI 0
Fabrício Lima

Fabrício Lima

24/01/2014

Caso o recovery do seu banco de dados seja FULL, você precisa deixar um espaço para o Log crescer e realizar backup do log para que ele seja limpo.

GOSTEI 0
Rafael Dantas

Rafael Dantas

24/01/2014

Entendido meu caro, muito obrigado!
Caso o recovery do seu banco de dados seja FULL, você precisa deixar um espaço para o Log crescer e realizar backup do log para que ele seja limpo.

GOSTEI 0
POSTAR