>>>SELECT 'Northwind' DBName >>> , O.Name TableName >>> , I.Name IndexName >>> , 'DBCC INDEXDEFRAG (Northwind, ' + O.Name + ', ' + I.Name + ')' IndexDFCommand >>> , CAST(0 AS BIT) IsDefragged >>> FROM Northwind.dbo.SysObjects O >>> INNER JOIN Northwind.dbo.SysIndexes I >>> ON O.ID = I.ID >>> WHERE O.xType = 'U' >>> AND OBJECTPROPERTY(I.ID, 'IsMSShipped') = 0 >>> AND I.IndID NOT IN (0, 255) >>> AND INDEXPROPERTY(I.ID, I.Name, 'IsStatistics') = 0 >>> AND INDEXPROPERTY(I.ID, I.Name, 'IsHypothetical') = 0 >>> AND INDEXPROPERTY(I.ID, I.Name, 'IsFulltextKey') = 0 >>>>>>
SELECT DB_NAME() AS DBName >> , O.Name TableName >> , I.Name IndexName >> , 'DBCC INDEXDEFRAG (' + DB_NAME() + ', ' + O.Name + ', ' + I.Name + ')' IndexDFCommand >> , CAST(0 AS BIT) IsDefragged >> FROM dbo.SysObjects O >> INNER JOIN dbo.SysIndexes I >> ON O.ID = I.ID >> WHERE O.xType = 'U' >> AND OBJECTPROPERTY(I.ID, 'IsMSShipped') = 0 >> AND I.IndID NOT IN (0, 255) >> AND INDEXPROPERTY(I.ID, I.Name, 'IsStatistics') = 0 >> AND INDEXPROPERTY(I.ID, I.Name, 'IsHypothetical') = 0 >> AND INDEXPROPERTY(I.ID, I.Name, 'IsFulltextKey') = 0 >>>
>set @SQL = 'SELECT ''' + @DBName + ''' DBNAME > , O.Name TableName > , I.Name IndexName > , ''DBCC INDEXDEFRAG (' + @DBName + ', '' + O.Name + '', '' + I.Name + '')'' IndexDFCommand > , CAST(0 AS BIT) IsDefragged > FROM ' + @DBName + '.dbo.SysObjects O > INNER JOIN ' + @DBName + '.dbo.SysIndexes I > ON O.ID = I.ID > WHERE O.xType = ''U'' > AND OBJECTPROPERTY(I.ID, ''IsMSShipped'') = 0 > AND I.IndID NOT IN (0, 255) > AND INDEXPROPERTY(I.ID, I.Name, ''IsStatistics'') = 0 > AND INDEXPROPERTY(I.ID, I.Name, ''IsHypothetical'') = 0 > AND INDEXPROPERTY(I.ID, I.Name, ''IsFulltextKey'') = 0 > ORDER BY TableName > , IndexName' >PRINT @SQL >EXECUTE sp_ExecuteSQL @SQL >>
/* JMA 20050506*/ /*Defrag All Indexes per DB*/ IF EXISTS ( SELECT * FROM dbo.SysObjects WHERE ID = OBJECT_ID(N'uspdba_DefragAllIndexesForDB') AND OBJECTPROPERTY(ID, N'IsProcedure') = 1 ) DROP PROCEDURE uspdba_DefragAllIndexesForDB GO CREATE PROCEDURE uspdba_DefragAllIndexesForDB @DBName VARCHAR(100) AS DECLARE @DBTable VARCHAR(200) , @SQLDropTable NVARCHAR(500) , @SQLSelectMain NVARCHAR(2000) , @SQLSelectMaxIndex NVARCHAR(500) , @SQLSelectCommand NVARCHAR(500) , @SQLUseDB NVARCHAR(500) , @Indexes INT , @MaxIndexes INT , @MI_Param NVARCHAR(100) , @SC_Param NVARCHAR(100) , @IDFCommand NVARCHAR(500) SET @DBTable = 'tbldba_' + @DBName + 'IndexDefrag' SET @Indexes = 1 SET @MI_Param = '@MaxIndexesOUT INT OUTPUT' SET @SQLUseDB = 'USE ' + @DBName SET @SQLDropTable = @SQLUseDB + ' DROP TABLE ' + @DBTable + '' SET @SQLSelectMain = ( @SQLUseDB + ' SELECT ''' + @DBName + ''' DBNAME , O.Name TableName , I.Name IndexName , ''DBCC INDEXDEFRAG (' + @DBName + ', '' + O.Name + '', '' + I.Name + '')'' IndexDFCommand , CAST(0 AS BIT) IsDefragged FROM ' + @@SERVERNAME + '.' + @DBName + '.dbo.SysObjects O INNER JOIN ' + @@SERVERNAME + '.' + @DBName + '.dbo.SysIndexes I ON O.ID = I.ID WHERE O.xType = ''U'' AND OBJECTPROPERTY(I.ID, ''IsMSShipped'') = 0 AND I.IndID NOT IN (0, 255) AND INDEXPROPERTY(I.ID, I.Name, ''IsStatistics'') = 0 AND INDEXPROPERTY(I.ID, I.Name, ''IsHypothetical'') = 0 AND INDEXPROPERTY(I.ID, I.Name, ''IsFulltextKey'') = 0 ORDER BY TableName , IndexName' ) /* Notes: OBJECTPROPERTY(id, 'IsMSShipped') = 0: Leaves out indexes on system tables (DBCC INDEXDEFRAG is not supported on system tables) IndID NOT IN (0, 255): Leaves out tables without an index (indid = 0) and indexes for text, ntext and image columns (indid = 255) INDEXPROPERTY(id, name, 'IsStatistics') = 0: leaves out entries in sysindexes that are actually statistics and not indexes. Statistics can be updated with UPDATE STATISTICS. INDEXPROPERTY(id, name, 'IsHypothetical') = 0: leaves out (temporary) indexes created by the Index Tuning Wizard to aid in performance tuning INDEXPROPERTY(id, name, 'IsFulltextKey') : leaves out full text indexes, they are handled indepently of normal SQL Server indexes */ SET @SQLSelectMaxIndex = @SQLUseDB + ' SELECT @MaxIndexesOUT = MAX(IndexDFID) FROM ' + @DBTable + ' (NOLOCK)' IF EXISTS ( SELECT * FROM SysObjects WHERE ID = OBJECT_ID(@DBTable) AND OBJECTPROPERTY(ID, 'IsUserTable') = 1 ) EXECUTE sp_ExecuteSQL @SQLDropTable EXECUTE sp_ExecuteSQL @SQLSelectMain EXECUTE sp_ExecuteSQL @SQLSelectMaxIndex , @MI_Param , @MaxIndexesOUT = @MaxIndexes OUTPUT /*Debug*/ --PRINT '1 - ' + @SQLUseDB --PRINT '2 - ' + @SQLDropTable --PRINT '3 - ' + @SQLSelectMain --PRINT '4 - ' + @SQLSelectMaxIndex WHILE @Indexes <= @MaxIndexes BEGIN SET @SQLSelectCommand = @SQLUseDB + ' SELECT @IDFCommandOUT = IndexDFCommand FROM ' + @DBTable + ' (NOLOCK) WHERE IndexDFID = ' + CAST(@Indexes AS VARCHAR(50)) + '' SET @SC_Param = '@IDFCommandOUT VARCHAR(500) OUTPUT' /*Debug*/ --PRINT '5 - ' + @SQLSelectCommand EXECUTE sp_ExecuteSQL @SQLSelectCommand , @SC_Param , @IDFCommandOUT = @IDFCommand OUTPUT PRINT 'Executing ' + @IDFCommand + '...' EXECUTE sp_ExecuteSQL @IDFCommand SET @Indexes = @Indexes + 1 END PRINT 'DONE!' GO