[SQL Server] Index Check Fragment

SELECT avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID('MaBase'),OBJECT_ID('MaTable2'), 1,NULL, 'LIMITED')

 

DECLARE @tablename VARCHAR (128)

DECLARE @execstr   VARCHAR (255)

DECLARE @objectid  INT

DECLARE @indexid   INT

DECLARE @frag      DECIMAL

DECLARE @maxfrag   DECIMAL

DECLARE @indexname VARCHAR (255)

DECLARE @like_tabname   varchar(250)

 

-- Decide on the maximum fragmentation to allow

SELECT @maxfrag = 30.0

 

-- Declare cursor

DECLARE tables CURSOR FOR

   SELECT TABLE_NAME

   FROM INFORMATION_SCHEMA.TABLES

   WHERE TABLE_TYPE = 'BASE TABLE'

     AND TABLE_NAME LIKE RTRIM(@like_tabname)

 

-- Create the table

CREATE TABLE #fraglist(

   ObjectName CHAR (255),

   ObjectId INT,

   IndexName CHAR (255),

   IndexId INT,

   Lvl INT,

   CountPages INT,

   CountRows INT,

   MinRecSize INT,

   MaxRecSize INT,

   AvgRecSize INT,

   ForRecCount INT,

   Extents INT,

   ExtentSwitches INT,

   AvgFreeBytes INT,

   AvgPageDensity INT,

   ScanDensity DECIMAL,

   BestCount INT,

   ActualCount INT,

   LogicalFrag DECIMAL,

   ExtentFrag DECIMAL)

 

-- Open the cursor

OPEN tables

 

-- Loop through all the tables in the database

FETCH NEXT

   FROM tables

   INTO @tablename

 

WHILE @@FETCH_STATUS = 0

BEGIN

-- Do the showcontig of all indexes of the table

   INSERT INTO #fraglist

   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')

      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS')

   FETCH NEXT

      FROM tables

      INTO @tablename

END

 

-- Close and deallocate the cursor

CLOSE tables

DEALLOCATE tables

 

-- Declare cursor for list of indexes to be defragged

DECLARE indexes CURSOR FOR

   SELECT ObjectName, ObjectId, IndexId, LogicalFrag, IndexName

   FROM #fraglist

   WHERE LogicalFrag >= @maxfrag

      AND INDEXPROPERTY(ObjectId, IndexName, 'IndexDepth') > 0

   ORDER BY LogicalFrag DESC

 

-- Open the cursor

OPEN indexes

 

-- loop through the indexes

FETCH NEXT

   FROM indexes

   INTO @tablename, @objectid, @indexid, @frag, @indexname

 

WHILE @@FETCH_STATUS = 0

BEGIN

   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',

      ' + RTRIM(@indexid) + ' ' + RTRIM(@indexname) +') - fragmentation currently '

       + RTRIM(CONVERT(varchar(15),@frag)) + '%'

 

 

   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',  ' + RTRIM(@indexid) + ')'

 

   PRINT @execstr

   PRINT '************************************************************************************'

/*

   EXEC (@execstr)

*/

 

   FETCH NEXT

      FROM indexes

      INTO @tablename, @objectid, @indexid, @frag, @indexname

END

 

-- Close and deallocate the cursor

CLOSE indexes

DEALLOCATE indexes

 

-- Delete the temporary table

 

DROP TABLE #fraglist