SQL Server 2005/ SQL Server 2008 - Rebuild or Reorganize ALL Indexes in a Database

I found this gem while looking at a database that needed all indexes rebuilt.

I actually had to create the programmatic way of doing rebuilding all indexes in a database based on the information in these posts:

See the fragmentation:

USE __REPLACE_WITH_DATABASE_NAME__
GO

Print 'Selecting Index Fragmentation in the database.'

SELECT 
  DB_NAME(DPS.DATABASE_ID) AS [DatabaseName]
 ,OBJECT_NAME(DPS.OBJECT_ID) AS TableName
 ,SI.NAME AS IndexName
 ,DPS.INDEX_TYPE_DESC AS IndexType
 ,DPS.AVG_FRAGMENTATION_IN_PERCENT AS AvgPageFragmentation
 ,DPS.PAGE_COUNT AS PageCounts
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) DPS --N'LIMITED') DPS
INNER JOIN sysindexes SI 
    ON DPS.OBJECT_ID = SI.ID 
    AND DPS.INDEX_ID = SI.INDID
ORDER BY DPS.avg_fragmentation_in_percent DESC
GO

Fix the fragmentation with a rebuild:

Print 'Rebuilding indexes on every table in the database.'

EXEC sp_MSforeachtable @command1="print 'Rebuilding indexes for ?' ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)"
GO

Fix the fragmentation with reorganize:

Print 'Reorganizing indexes on every table in the database.'

EXEC sp_MSforeachtable @command1="print 'Reorganizing indexes for ?' ALTER INDEX ALL ON ? REORGANIZE"
GO

Notice how we have items that are at 99% fragmentation and how they are gone once we run this rebuild.

image

Awesome?

If you are fuddy-duddy DBA, you would say only to rebuild indexes with greater than 30% fragmentation and reorganize the rest.  That's fine, show me some code on how to programmatically do this! :D

Or put the Ayende way, send me a patch!

kick it on DotNetKicks.com