Blog Post

T-SQL to find Fragmented Indexes

,

Fragmentation of Indexes is one of the reason for low performing queries resulting in a poor application performance.

Today, I will present a simple script which will help in identifying the level of fragmentation in a Database.

--Replace this with the name of the Database for which we want to find the fragmentation.

USE <DBName> 

GO

 

DECLARE @DBName AS VARCHAR(10) = 'DBName'

DECLARE @DBID AS INT = DB_ID(@DBName)

DECLARE @AllowedFragmentation AS INT = 70 --A acceptable value in Percent(%) for fragmentation.

DECLARE @Qry AS VARCHAR(MAX)

 

SELECT

  --@DBID [DBID],

  --@DBName DBName,

  PS.OBJECT_ID ObjectID,

  COALESCE(T.name,V.name) ObjectName,

  PS.index_id,

  I.name IndexName,

  PS.page_count AS TotalPages,

  (PS.page_count * 8)/1024.0 as TotalMB,

  ((PS.page_count * 8)/1024.0) * (PS.avg_fragmentation_in_percent/100) as ReclaimableMB,

  PS.avg_fragmentation_in_percent AvgFragmentationPercent

FROM

  sys.dm_db_index_physical_stats (@DBID, NULL, NULL, NULL, NULL) AS PS

INNER JOIN sys.indexes AS I

  ON PS.OBJECT_ID = I.OBJECT_ID

    AND PS.index_id = I.index_id  

LEFT JOIN sys.tables T

  ON T.object_id = I.object_id

LEFT JOIN sys.views V

  ON V.object_id = I.object_id

WHERE

  PS.database_id = @DBID

  AND PS.avg_fragmentation_in_percent > @AllowedFragmentation 

ORDER BY    

  PS.avg_fragmentation_in_percent DESC 

Here, I have considered 70% fragmentation as an acceptable level of fragmentation.

Hope, this helps.

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating