Array
(
)

DBCC INDEXDEFRAG

Rafael Dantas
   - 24 jan 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?

Fabriciolimadba
   - 24 jan 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

Rafael Dantas
   - 27 jan 2014

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

Citação:
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

Fabriciolimadba
   - 28 jan 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.

Rafael Dantas
   - 28 jan 2014

Entendido meu caro, muito obrigado!

Citação:
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.