SQL Server: Find fragmentation of tables and indexes


Without adding so many paragraphs, since you are looking for fragmentation, you can below procedure. 

You can create it in the same database. 

CREATE PROCEDURE usp_CheckFragmentation @TableName NVARCHAR(128) = NULL AS BEGIN SET NOCOUNT ON; IF OBJECT_ID('tempdb..#Fragmentation') IS NOT NULL DROP TABLE #Fragmentation; CREATE TABLE #Fragmentation ( DatabaseName SYSNAME, SchemaName SYSNAME, TableName SYSNAME, IndexName SYSNAME, IndexTypeDesc NVARCHAR(60), AvgFragmentationInPercent FLOAT, PageCount BIGINT ); DECLARE @SQL NVARCHAR(MAX); SET @SQL = ' INSERT INTO #Fragmentation SELECT DB_NAME() AS DatabaseName, s.name AS SchemaName, t.name AS TableName, i.name AS IndexName, i.type_desc AS IndexTypeDesc, ps.avg_fragmentation_in_percent AS AvgFragmentationInPercent, ps.page_count AS PageCount FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, ''LIMITED'') ps INNER JOIN sys.indexes i ON ps.object_id = i.object_id AND ps.index_id = i.index_id INNER JOIN sys.tables t ON ps.object_id = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE (@TableName IS NULL OR t.name = @TableName)'; EXEC sp_executesql @SQL, N'@TableName NVARCHAR(128)', @TableName; SELECT * FROM #Fragmentation ORDER BY AvgFragmentationInPercent DESC; DROP TABLE #Fragmentation; END; GO

No comments:

Post a Comment