2017-09-11 07:52:50 -07:00
SELECT dbschemas . [ name ] as ' Schema ' ,
dbtables . [ name ] as ' Table ' ,
dbindexes . [ name ] as ' Index ' ,
2018-12-31 12:47:41 -08:00
- - averaging this number across all partitions is not correct ( page_count must bw accounted ) but it is okay for my needs
AVG ( indexstats . avg_fragmentation_in_percent ) AS avg_fragmentation_in_percent ,
SUM ( indexstats . page_count ) AS page_count ,
' ALTER INDEX [ ' + dbindexes . [ name ] + ' ] ON [ ' + dbschemas . name + ' ].[ ' + dbtables . [ name ] + ' ] REORGANIZE; ' AS CmdReorg ,
2018-12-31 15:31:28 -08:00
' ALTER INDEX [ ' + dbindexes . [ name ] + ' ] ON [ ' + dbschemas . name + ' ].[ ' + dbtables . [ name ] + ' ] REBUILD WITH (FILLFACTOR = 90, ONLINE = ON, DATA_COMPRESSION = PAGE, SORT_IN_TEMPDB = ON); ' AS CmdRebuild
2017-09-11 07:52:50 -07:00
FROM sys . dm_db_index_physical_stats ( DB_ID ( ) , NULL , NULL , NULL , NULL ) AS indexstats
INNER JOIN sys . tables dbtables on dbtables . [ object_id ] = indexstats . [ object_id ]
INNER JOIN sys . schemas dbschemas on dbtables . [ schema_id ] = dbschemas . [ schema_id ]
INNER JOIN sys . indexes AS dbindexes ON dbindexes . [ object_id ] = indexstats . [ object_id ]
2018-12-31 12:47:41 -08:00
AND indexstats . index_id = dbindexes . index_id
2017-09-11 07:52:50 -07:00
WHERE indexstats . database_id = DB_ID ( )
2018-12-31 12:47:41 -08:00
AND indexstats . page_count > 100
AND dbindexes . [ name ] IS NOT NULL
GROUP BY dbschemas . [ name ] ,
dbtables . [ name ] ,
dbindexes . [ name ]
ORDER BY avg_fragmentation_in_percent DESC