DBCC INDEXDEFRAG

24/01/2014

0

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

Responder

Posts

24/01/2014

Fabrício Lima

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
Responder

27/01/2014

Rafael Dantas

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
Responder

28/01/2014

Fabrício Lima

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.

Responder

28/01/2014

Rafael Dantas

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.

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar