Blog

Dicas para um DBA iniciante – Listar fragmentação de índices de todos os bancos de dados

By Vitor Fava

Fala pessoal, tudo bem com vocês?

Hoje quero compartilhar mais um script muito útil que precisei utilizar recentemente no meu dia a dia como DBA SQL Server.

Esse script utiliza a stored procedure de sistema SP_MSFOREACHDB para executar uma verificação na fragmentação de todos os índices de cada uma das bases de dados existentes em sua instância de banco de dados SQL Server.

IF EXISTS (SELECT * FROM TEMPDB.SYS.ALL_OBJECTS WHERE 
			NAME LIKE '#bbc%' )
	DROP TABLE #bbc

CREATE TABLE #bbc
(
	DatabaseName VARCHAR(100),
	ObjectName VARCHAR(100),
	Index_id INT, 
	indexName VARCHAR(100),
	avg_fragmentation_percent FLOAT,
	IndexType VARCHAR(100),
	Action_Required VARCHAR(100) DEFAULT 'NA'
)
GO

INSERT INTO #bbc (
					DatabaseName,
					ObjectName,
					Index_id, 
					indexName,
					avg_fragmentation_percent,
					IndexType
				 )

EXEC MASTER.SYS.SP_MSFOREACHDB ' USE [?]

SELECT 
	db_name() as DatabaseName, 
	OBJECT_NAME (a.object_id) as ObjectName, 
	a.index_id, 
	b.name as IndexName, 
	avg_fragmentation_in_percent, 
	index_type_desc
FROM 
	sys.dm_db_index_physical_stats (db_id(), NULL, NULL, NULL, NULL) AS a
INNER JOIN 
	sys.indexes AS b 
ON 
	a.object_id = b.object_id 
AND 
	a.index_id = b.index_id
WHERE 
	b.index_id  0 
AND 
	avg_fragmentation_in_percent  0'
GO
 
UPDATE #bbc
SET Action_Required ='Rebuild'
WHERE avg_fragmentation_percent >30 
GO

UPDATE #bbc
SET Action_Required ='Reorganize'
WHERE avg_fragmentation_percent 5
GO

SELECT 
	* 
FROM 
	#bbc 
ORDER BY 
	#bbc.avg_fragmentation_percent 
DESC

Espero que gostem e não deixem de inscreverem-se no blog, no canal do youtube, no grupo de discussão SQLManiacs e em nosso grupo no TELEGRAM.

Grande abraço a todos.

Fonte: Vitor Fava