Oi
Todos os índices no banco de dados do SQL Server serão fragmentados Depois que as tabelas relacionadas tiverem muitas atualizações, exclua as transações.
Índice de reconstrução do SQL Server
Se o índice na tabela estiver fragmentado, todas as transações relacionadas a essa tabela serão muito lentas. Portanto, o SQL Server DBA deve monitorar frequentemente os índices e quais dos índices são fragmentados e quais não são.
SQL Server Reorganizar Índice
Você pode usar o índice fragmentado com o procedimento a seguir. Este procedimento de reconstrução e reorganização do índice depende de sua situação
CREATE PROC [INDEX_MAINTENANCE] @DBName VARCHAR(100) AS BEGIN SET NOCOUNT ON; DECLARE @OBJECT_ID INT, @INDEX_NAME sysname, @SCHEMA_NAME sysname, @OBJECT_NAME sysname, @AVG_FRAG float, @command varchar(8000), @RebuildCount int, @ReOrganizeCount int CREATE TABLE #tempIM ( [ID] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY, [INDEX_NAME] sysname NULL, [OBJECT_ID] INT NULL, [SCHEMA_NAME] sysname NULL, [OBJECT_NAME] sysname NULL, [AVG_FRAG] float ) SELECT @RebuildCount=0,@ReOrganizeCount=0 --Get Fragentation values SELECT @command= 'Use ' + @DBName + '; INSERT INTO #tempIM (OBJECT_ID, INDEX_NAME, SCHEMA_NAME, OBJECT_NAME, AVG_FRAG) SELECT ps.object_id, i.name as IndexName, OBJECT_SCHEMA_NAME(ps.object_id) as ObjectSchemaName, OBJECT_NAME (ps.object_id) as ObjectName, ps.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL , NULL, ''LIMITED'') ps INNER JOIN sys.indexes i ON i.object_id=ps.object_id and i.index_id=ps.index_id WHERE avg_fragmentation_in_percent > 5 AND ps.index_id > 0 and ps.database_id=DB_ID('''[email protected]+''') ORDER BY avg_fragmentation_in_percent desc ' exec(@command) DECLARE c CURSOR FAST_FORWARD FOR SELECT OBJECT_ID,INDEX_NAME, SCHEMA_NAME, OBJECT_NAME, AVG_FRAG FROM #tempIM OPEN c FETCH NEXT FROM c INTO @OBJECT_ID, @INDEX_NAME, @SCHEMA_NAME, @OBJECT_NAME, @AVG_FRAG WHILE @@FETCH_STATUS = 0 BEGIN --Reorganize or Rebuild IF @AVG_FRAG>30 BEGIN SELECT @command = 'Use ' + @DBName + '; ALTER INDEX [' + @INDEX_NAME +'] ON [' + @SCHEMA_NAME + '].[' + @OBJECT_NAME + '] REBUILD WITH (ONLINE = ON )'; SET @RebuildCount = @RebuildCount+1 END ELSE BEGIN SELECT @command = 'Use ' + @DBName + '; ALTER INDEX [' + @INDEX_NAME +'] ON [' + @SCHEMA_NAME + '].[' + @OBJECT_NAME + '] REORGANIZE '; SET @ReOrganizeCount = @ReOrganizeCount+1 END BEGIN TRY EXEC (@command); END TRY BEGIN CATCH END CATCH FETCH NEXT FROM c INTO @OBJECT_ID, @INDEX_NAME, @SCHEMA_NAME, @OBJECT_NAME, @AVG_FRAG END CLOSE c DEALLOCATE c DROP TABLE #tempIM SELECT cast(@RebuildCount as varchar(5))+' index Rebuild,'+cast(@ReOrganizeCount as varchar(5))+' index Reorganize is done.' as Result END
Você pode executar este procedimento com a seguinte consulta. Digite o nome do banco de dados em vez de DEVECI corretamente e o procedimento reconstruirá e reorganizará os índices de bancos de dados relacionados.
exec dbo.INDEX_MAINTENANCE 'DEVECI';