1) Modify variables for e-mail address, e-mail subject.
2) Create the procedure in the UserDB.
Check the resources below for the stored procedure used.
1) Modify variables for e-mail address, e-mail subject.
2) Create the procedure in the UserDB.
Check the resources below for the stored procedure used.
IF OBJECT_ID('dbo.usp_OnlineIndexRebuild') IS NOT NULL BEGIN DROP PROCEDURE dbo.usp_OnlineIndexRebuild IF OBJECT_ID('dbo.usp_OnlineIndexRebuild') IS NOT NULL PRINT '<<< FAILED DROPPING PROCEDURE dbo.usp_OnlineIndexRebuild >>>' ELSE PRINT '<<< DROPPED PROCEDURE dbo.usp_OnlineIndexRebuild >>>' END go SET ANSI_NULLS ON go SET QUOTED_IDENTIFIER OFF go CREATE PROCEDURE dbo.usp_OnlineIndexRebuild @Emailrecipients varchar(MAX) = 'tbollhofer2@gmail.com', @EmailSubject varchar(MAX) = 'Index Maintenance Report' AS /* Name: dbo.usp_OnlineIndexRebuild Contact: Tommy Bollhofer (tbollhofer2@gmail.com) Purpose: Identifies indexes with average logical fragmentation >= 30% using the DM available in MSSQL 2005; performs an online rebuild for indexes that do not contain text,ntext,image or xml datatypes; performs an offline rebuild for indexes that do contain these datatypes. Last Modified: 08/17/2007 */ DECLARE @dbId INT SET @dbId = db_id() CREATE TABLE #fragReport ( RowID int identity (1,1), Object_Id int, Index_Id int, Index_Name sysname, LogicalFragmentation float ) CREATE TABLE #reindex_online ( RowID int identity (1,1), Object_Name sysname, Index_Name sysname ) CREATE TABLE #reindex_offline ( RowID int identity (1,1), Object_Name sysname, Index_Name sysname ) CREATE TABLE #contains_text ( RowID int identity (1,1), Index_Name sysname ) INSERT INTO #fragReport([Object_Id], [Index_Id],[Index_Name],[LogicalFragmentation]) SELECT A.object_id, A.index_id, [name], Avg_Fragmentation_In_Percent FROM sys.dm_db_index_physical_stats (@dbId, NULL,NULL, NULL, NULL) AS A JOIN sys.indexes B WITH(NOLOCK) ON A.Object_id = B.Object_id AND A.Index_id = B.Index_id WHERE Avg_Fragmentation_In_Percent >= 30 AND B.[name] IS NOT NULL INSERT INTO #contains_text SELECT A.Index_Name FROM #fragReport A JOIN sys.columns B WITH(NOLOCK) ON A.Object_Id = B.Object_id AND B.system_type_id IN (34,35,99,241) GROUP BY A.Index_Name INSERT INTO #reindex_online([Object_Name],[Index_Name]) SELECT C.name + '.' + B.name AS [Object_Name], A.[Index_Name] FROM #fragReport A WITH(NOLOCK) JOIN sys.tables B WITH(NOLOCK) ON A.Object_Id = B.Object_Id JOIN sys.schemas C WITH(NOLOCK) ON B.schema_id = C.schema_id WHERE A.Index_Name NOT IN (SELECT Index_Name FROM #contains_text WITH(NOLOCK)) INSERT INTO #reindex_offline([Object_Name],[Index_Name]) SELECT C.name + '.' + B.name AS [Object_Name], A.[Index_Name] FROM #fragReport A WITH(NOLOCK) JOIN sys.tables B WITH(NOLOCK) ON A.Object_Id = B.Object_Id JOIN sys.schemas C WITH(NOLOCK) ON B.schema_id = C.schema_id WHERE A.Index_Name IN (SELECT Index_Name FROM #contains_text WITH(NOLOCK)) DECLARE @numtables int, @numindexes int, @numreindexes int, @tabcount int, @indcount int, @recount int, @currtable int, @tabname varchar(255), @currind int, @indname varchar(255) SELECT @numreindexes = count(*) FROM #reindex_online WITH(NOLOCK) SET @recount = 1 WHILE @recount <= @numreindexes BEGIN SELECT @tabname = [Object_Name], @indname = [Index_Name] FROM #reindex_online WHERE RowId = @recount EXEC ('ALTER INDEX ' + @indname + ' ON ' + @tabname + ' REBUILD WITH(PAD_INDEX = OFF, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, SORT_IN_TEMPDB = OFF, ONLINE = ON)') SET @recount = @recount + 1 END SELECT @numreindexes = count(*) FROM #reindex_offline WITH(NOLOCK) SET @recount = 1 WHILE @recount <= @numreindexes BEGIN SELECT @tabname = [Object_Name], @indname = [Index_Name] FROM #reindex_offline WHERE RowId = @recount EXEC ('ALTER INDEX ' + @indname + ' ON ' + @tabname + ' REBUILD WITH(PAD_INDEX = OFF, FILLFACTOR = 80, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF)') SET @recount = @recount + 1 END DECLARE @tableHTML nvarchar(MAX) ; SET @tableHTML = N'<STYLE TYPE="text/css">TD{font-family: calibri; font-size: 10pt;}</STYLE>' + N'<b><font face="calibri" size="2">This report represents index(s) which have an average fragmentation > than 30 percent. These index(s) have been targeted for maintenance.</font></b><br><br>' + N'<table border="1" cellpadding="2" cellspacing="2" border="1">' + N'<tr><th><font face="calibri" size="2">Table Name</font></th><th><font face="calibri" size="2">Index Name</font></th><th><font face="calibri" size="2">LogicalFragmentation</font></th>' + CAST ( ( SELECT td = C.name + '.' + B.name, '', td = A.Index_Name, '', td = convert(char(2),convert(int,A.LogicalFragmentation)) + '%', '' FROM #fragReport A JOIN sys.tables B WITH(NOLOCK) ON A.Object_Id = B.Object_Id JOIN sys.schemas C WITH(NOLOCK) ON B.schema_id = C.schema_id FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; EXEC msdb.dbo.sp_send_dbmail @recipients = @Emailrecipients, @subject = @EmailSubject, @body = @tableHTML, @body_format = 'HTML' ; DROP TABLE #fragreport DROP TABLE #contains_text DROP TABLE #reindex_online DROP TABLE #reindex_offline go SET ANSI_NULLS OFF go SET QUOTED_IDENTIFIER OFF go IF OBJECT_ID('dbo.usp_OnlineIndexRebuild') IS NOT NULL PRINT '<<< CREATED PROCEDURE dbo.usp_OnlineIndexRebuild >>>' ELSE PRINT '<<< FAILED CREATING PROCEDURE dbo.usp_OnlineIndexRebuild >>>' go