vendredi 7 octobre 2011

MS SQL Maintenance Plan


0] Administration

0.1 Description & History

-- Maintenance Plan description
SELECT * FROM   msdb.dbo.sysmaintplan_plans p
INNER JOIN msdb.dbo.sysmaintplan_subplans sp ON p.id = sp.plan_id
LEFT OUTER JOIN msdb.dbo.sysjobschedules j   ON j.schedule_id = sp.schedule_id  

-- Plan overall duration & Next Run
SELECT name , start_time , end_time , next_run_date , next_run_time , DateDiff(second, start_time , end_time)/60 TotalMinutes
FROM msdb.dbo.sysmaintplan_plans p
INNER JOIN msdb.dbo.sysmaintplan_subplans sp  ON p.id = sp.plan_id
INNER JOIN msdb.dbo.sysmaintplan_log          spl ON spl.subplan_id=sp.subplan_id
LEFT OUTER JOIN msdb.dbo.sysjobschedules  j   ON j.schedule_id = sp.schedule_id  
where name like '%Hebdo%'


Server_name
Mntce_Plan
start
end
next_run_date
next_run_time
TotalMinutes
W-INSTANCE-1\NAMED
MaintenancePlanHebdo
2012-09-08 20:00:01.800
2012-09-08 20:09:06.193
20120915
200000
9
W-INSTANCE-1\NAMED1
MaintenancePlanHebdo
2012-09-08 22:00:15.707
2012-09-09 22:46:29.327
20120915
220000
1486
W-INSTANCE-1\NAMED2
MaintenancePlanHebdo
2012-09-08 20:00:01.160
2012-09-09 05:05:51.273
20120915
200000
545


-- History of executions
SELECT
ld.server_name AS [ServerName],
ld.start_time AS [StartTime],
ld.end_time AS [EndTime],
ld.error_number AS [ErrorNo],
ld.error_message AS [ErrorMessage],
ld.command AS [Command],
ld.succeeded AS [Succeeded]
FROM msdb.dbo.sysmaintplan_plans AS s
INNER JOIN msdb.dbo.sysmaintplan_subplans AS sp ON sp.plan_id=s.id
INNER JOIN msdb.dbo.sysmaintplan_log AS spl ON spl.subplan_id=sp.subplan_id
INNER JOIN msdb.dbo.sysmaintplan_logdetail AS ld ON ld.task_detail_id=spl.task_detail_id
ORDER BY [StartTime] DESC


ServerName
StartTime
EndTime
ErrorNo
ErrorMessage
Command
Succeeded
SRV
2015-04-07 20:00:36.000
2015-04-07 20:00:36.000
NULL


1
SRV
2015-04-07 20:00:36.000
2015-04-07 20:00:36.000
NULL


1
SRV
2015-04-07 20:00:02.000
2015-04-07 20:00:36.000
NULL


1
SRV
2015-04-06 20:00:36.000
2015-04-06 20:00:36.000
NULL


1
SRV
2015-04-06 20:00:36.000
2015-04-06 20:00:37.000
NULL


1

BTW Job execution History, thanks to
http://www.mssqltips.com/sqlservertip/2850/querying-sql-server-agent-job-history-data/
I just added the « run status »

-- Job History of executions
select
 j.name as 'JobName',
 s.step_id as 'Step',
 s.step_name as 'StepName',
 msdb.dbo.agent_datetime(run_date, run_time) as 'RunDateTime',
 ((run_duration/10000*3600 + (run_duration/100)%100*60 + run_duration%100 + 31 ) / 60)
         as 'RunDurationMinutes',
case run_status when 1 then 'OK' when 0 then 'KO' end status
From msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobsteps s
 ON j.job_id = s.job_id
INNER JOIN msdb.dbo.sysjobhistory h
 ON s.job_id = h.job_id
 AND s.step_id = h.step_id
 AND h.step_id <> 0
where j.enabled = 1   --Only Enabled Jobs
and j.name = 'ETL_OLAP'
/*
and msdb.dbo.agent_datetime(run_date, run_time)
BETWEEN '12/08/2012' and '12/10/2012'  --Uncomment for date range queries
*/
order by JobName, RunDateTime desc

JobName
Step
StepName
RunDateTime
RunDurationMinutes
status
ETL_OLAP
2
2_OLAP
2015-04-08 00:08:31.000
1
OK
ETL_OLAP
1
1_ETL
2015-04-07 23:30:00.000
39
OK
ETL_OLAP
2
2_OLAP
2015-04-06 23:57:36.000
1
OK
ETL_OLAP
1
1_ETL
2015-04-06 23:30:00.000
28
OK
ETL_OLAP
2
2_OLAP
2015-04-04 00:08:12.000
1
OK
ETL_OLAP
1
1_ETL
2015-04-03 23:30:00.000
38
OK
ETL_OLAP
2
2_OLAP
2015-04-03 00:07:43.000
1
OK

0.2 Notification Operator Management

USE master
GO
--Enable database mail
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE
GO
--create database mail account
EXEC msdb.dbo.sysmail_add_account_sp @account_name = 'Job Alerts Account',
@email_address = 'SQL.Alerts@comp_name',
@replyto_address = 'mail_1@comp_name',
@description = 'SQL Server Job Alerts Account',
@mailserver_name = 'sr-smtp'
GO
--create database mail profile
EXEC msdb.dbo.sysmail_add_profile_sp @profile_name=N'Job Alerts Profile',
@description=N'SQL Server Job Alerts Profile'
GO
--add account to profile
EXEC msdb.dbo.sysmail_add_profileaccount_sp @profile_name=N'Job Alerts Profile', @account_name=N'Job Alerts Account', @sequence_number=1
GO
--make profile public, default
EXEC msdb.dbo.sysmail_add_principalprofile_sp @principal_name=N'guest', @profile_name=N'Job Alerts Profile', @is_default=1
GO
--Create mail operator account
EXEC msdb.dbo.sp_add_operator @name=N'JobsAlertsEmailOperator', @enabled=1, @pager_days=0,
@email_address=N'mail_1@comp_name;mail_2@comp_name'
GO

use msdb
go
EXECUTE sp_help_operator
go

0.3 sql server disable maintenance plan using tsql

USE msdb ;

SELECT name FROM sysjobs WHERE enabled = 1

EXEC dbo.sp_update_job
    @job_name = N'MP_INST1_JOUR_PRO_2.Subplan_1',
    @enabled = 0;
GO



1] Index Maintenance

Goal
Index Reorganize or Rebuild based on % Fragmentation threshold
Version
2008 R2
Views
Function
sys.databases  sys.indexes  sys.partitions  sys.objects  sys.schemas
sys.dm_db_index_physical_stats
Log as
SYSADMIN

Should be run under a Weekly basis. This is much better than the default Index Rebuild provided by SSIS box ( very Transaction Log consuming ).

1.1 Create Procedure in MASTER DB

This procedure was adapted from MS :
-       First Argument : Reorganization threshold % ( usually 10 )
-       Second Argument : Rebuild threshold % ( usually 30 )
It checks if the Index is big enough to benefit of a maintenance ( > 1 MB ) & if allow_page_locks = 1
exec sp_adb_IndexMntc '10','30'

USE master
IF EXISTS (SELECT name FROM   sysobjects WHERE  name = N'sp_adb_IndexMntc ' AND type = 'P')
     DROP PROCEDURE sp_adb_IndexMntc
GO

CREATE PROCEDURE [dbo].[sp_adb_IndexMntc] ( @FragmentationLevel1 int , @FragmentationLevel2 int )
--@FragmentationLevel1 int = 10,
--@FragmentationLevel2 int = 30
AS
BEGIN

-- Ensure a USE <databasename> statement has been executed first.
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);
DECLARE @command2 nvarchar(4000);
DECLARE @dbname nvarchar(64);
DECLARE @IndexSizeKB int;
DECLARE @IndexSizeKB2 varchar(50);
DECLARE @ALLOW_PAGE_LOCK int;
DECLARE @txtbody nvarchar(512);

select @dbname = name from sys.databases where database_id = DB_ID() ;
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function
-- and convert object and index IDs to names.

-- ensure the temporary table does not exist
IF (SELECT OBJECT_ID('tempdb..#work_to_do')) IS NOT NULL
DROP TABLE #work_to_do;

-- ensure the temporary table does not exist
IF (SELECT OBJECT_ID('tempdb..#TempSp_spaceused')) IS NOT NULL
DROP TABLE #TempSp_spaceused;

-- A procedure level temp table to store the resulting Index Size After
CREATE TABLE #TempSp_spaceused
(
    tableName varchar(100),  numberofRows integer,    reservedSize varchar(50),
    dataSize varchar(50),    indexSize varchar(50),   unusedSize varchar(50)
)

SELECT
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > @FragmentationLevel1 AND index_id > 0 ;

-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;

-- Open the cursor.
OPEN partitions;

-- Loop through the partitions.
WHILE (1=1)
    BEGIN;
       FETCH NEXT
           FROM partitions
           INTO @objectid, @indexid, @partitionnum, @frag;
       IF @@FETCH_STATUS < 0 BREAK;

        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
        FROM sys.objects AS o
        JOIN sys.schemas as s ON s.schema_id = o.schema_id
        WHERE o.object_id = @objectid;
      
        SELECT @indexname = QUOTENAME(name)
        FROM sys.indexes
        WHERE  object_id = @objectid AND index_id = @indexid;
      
        SELECT @partitioncount = count (*)
        FROM sys.partitions
        WHERE object_id = @objectid AND index_id = @indexid;

    -- is the index big enough ? or row_lock_page accepted when reorganizing allow_page_locks=1 ?
        SET @command2 = N'INSERT #TempSp_spaceused EXEC sp_spaceused "' + @schemaname + N'.' + @objectname + N'"' ;
        exec (@command2);
        select @IndexSizeKB = replace(indexSize,' KB','') from #TempSp_spaceused ;

        select @ALLOW_PAGE_LOCK = allow_page_locks from sys.indexes where object_id = @objectid and index_id = @indexid ;

           IF @IndexSizeKB > 1024 AND @ALLOW_PAGE_LOCK = 1
           BEGIN

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
        IF @frag < @FragmentationLevel2
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
        IF @frag >= @FragmentationLevel2
            SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
        IF @partitioncount > 1
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
        EXEC (@command);
        -- get new Index size
        -- schemaname name is needed to take care of Msg 15009, The object xxx does not exist in database xxx or is invalid for this operation.
        SET @command2 = N'INSERT #TempSp_spaceused EXEC sp_spaceused "' + @schemaname + N'.' + @objectname + N'"' ;
        exec (@command2);
        select @IndexSizeKB2 = indexSize from #TempSp_spaceused ;
       
        SELECT @txtBody = 'Executed: ' + @dbname + ' Frag ' + cast(ceiling(@frag) as nvarchar(10)) + ' Idx Size KB before ' + cast(ceiling(@IndexSizeKB) as nvarchar(10)) + ' ' + ' Idx Size KB after ' + @IndexSizeKB2 + ' ' + @command ;
        print @txtBody
        -- PRINT N'Executed: ' + @dbname + ' Frag ' + cast(ceiling(@frag) as nvarchar(10)) + ' Idx Size KB before ' + cast(ceiling(@IndexSizeKB) as nvarchar(10)) + ' ' + @command;
        exec master..xp_logevent 50001, @txtBody, 'Informational'
      
       END;
    END;

-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- Drop the temporary tables.
DROP TABLE #work_to_do;
DROP TABLE #TempSp_spaceused;

END
GO

1.2 Make the Procedure visible from every Databases


-- SS2k5 provides a stored procedure to mark the object as system
USE master
go
EXEC sys.sp_MS_marksystemobject sp_adb_IndexMntc
GO

--test
USE DB_NAME
go
EXEC sp_adb_IndexMntc '10','30'
go


1.3 Run it in every Databases


EXECUTE master.sys.sp_MSforeachdb 'USE [?]; exec sp_adb_IndexMntc ''10'',''30'''


·          Task T-SQL

EXEC sys.sp_MSforeachdb 'USE ?;DECLARE @name VARCHAR(50)
SELECT @name=DB_NAME() ; if @name != ''TEMPDB'' begin
USE [?]; exec sp_adb_IndexMntc ''30'',''60''
end'

or For Sharepoint :

EXEC master..sp_MSForeachdb '
USE [?]
if ''?'' in (''master'',''model'',''msdb'',''tempdb'') return
BEGIN
        IF NOT EXISTS (SELECT name FROM sysobjects WHERE name = N''Proc_DefragmentIndices'' AND type = ''P'')
     -- SELECT ''?''
         exec sp_adb_IndexMntc ''10'',''30''
END
'

It may then be executed in a T-SQL Maintenance Task scheduled every week.

1st Run

Executed: DB_NAME Frag 63 Idx Size KB before 13536  Idx Size KB after 11464 KB ALTER INDEX [IX_TAB_ASSET] ON [SCHEMA].[TAB_ASSET] REBUILD
Executed: DB_NAME Frag 78 Idx Size KB before 66672  Idx Size KB after 66120 KB ALTER INDEX [PK_TABLE_SD] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 97 Idx Size KB before 66120  Idx Size KB after 60744 KB ALTER INDEX [FK_TABLE_SD_CATALOG] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 60744  Idx Size KB after 56680 KB ALTER INDEX [FK_TABLE_SD_EMPLOYEE] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 97 Idx Size KB before 56680  Idx Size KB after 51040 KB ALTER INDEX [FK_TABLE_SD_LOCATION] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 80 Idx Size KB before 51040  Idx Size KB after 46992 KB ALTER INDEX [FK_TABLE_SD_PROJECT] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 80 Idx Size KB before 46992  Idx Size KB after 42944 KB ALTER INDEX [FK_TABLE_SD_EP_BUDGET] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 80 Idx Size KB before 42944  Idx Size KB after 38896 KB ALTER INDEX [FK_TABLE_SD_EP_ORDER] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 80 Idx Size KB before 38896  Idx Size KB after 34848 KB ALTER INDEX [FK_TABLE_SD_SD_KBASE] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 93 Idx Size KB before 2080  Idx Size KB after 2080 KB ALTER INDEX [PK_DEPARTMENT] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 47 Idx Size KB before 2080  Idx Size KB after 2024 KB ALTER INDEX [DEPARTMENT_IDX1] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 89 Idx Size KB before 2024  Idx Size KB after 1984 KB ALTER INDEX [DEPARTMENT_IDX10] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1984  Idx Size KB after 1944 KB ALTER INDEX [DEPARTMENT_IDX11] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 1944  Idx Size KB after 1888 KB ALTER INDEX [DEPARTMENT_IDX12] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 85 Idx Size KB before 1888  Idx Size KB after 1784 KB ALTER INDEX [DEPARTMENT_IDX2] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 55 Idx Size KB before 1784  Idx Size KB after 1720 KB ALTER INDEX [DEPARTMENT_IDX3] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 75 Idx Size KB before 1720  Idx Size KB after 1680 KB ALTER INDEX [DEPARTMENT_IDX4] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1680  Idx Size KB after 1640 KB ALTER INDEX [DEPARTMENT_IDX5] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1640  Idx Size KB after 1600 KB ALTER INDEX [DEPARTMENT_IDX6] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 75 Idx Size KB before 1600  Idx Size KB after 1568 KB ALTER INDEX [DEPARTMENT_IDX7] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1568  Idx Size KB after 1536 KB ALTER INDEX [DEPARTMENT_IDX8] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 1536  Idx Size KB after 1480 KB ALTER INDEX [DEPARTMENT_IDX9] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 90 Idx Size KB before 1480  Idx Size KB after 1424 KB ALTER INDEX [FK_DEPARTMENT_COST_CENTER] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1424  Idx Size KB after 1384 KB ALTER INDEX [FK_DEPARTMENT_DEPARTMENT] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1384  Idx Size KB after 1344 KB ALTER INDEX [FK_DEPARTMENT_EMPLOYEE] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 2736  Idx Size KB after 2720 KB ALTER INDEX [PK_EMPLOYEE] ON [SCHEMA].[EMPLOYEE] REBUILD
Executed: DB_NAME Frag 99 Idx Size KB before 2720  Idx Size KB after 2360 KB ALTER INDEX [FK_EMPLOYEE_DEPARTMENT] ON [SCHEMA].[EMPLOYEE] REBUILD
Executed: DB_NAME Frag 86 Idx Size KB before 2360  Idx Size KB after 1928 KB ALTER INDEX [FK_EMPLOYEE_LOCATION] ON [SCHEMA].[EMPLOYEE] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 1928  Idx Size KB after 1512 KB ALTER INDEX [FK_EMPLOYEE_SCHEDULE] ON [SCHEMA].[EMPLOYEE] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 1512  Idx Size KB after 1064 KB ALTER INDEX [IX_EMPLOYEE] ON [SCHEMA].[EMPLOYEE] REBUILD
Executed: DB_NAME Frag 86 Idx Size KB before 15232  Idx Size KB after 15216 KB ALTER INDEX [PK_METRIC_RESULTS] ON [SCHEMA].[METRIC_RESULTS] REBUILD
Executed: DB_NAME Frag 82 Idx Size KB before 58224  Idx Size KB after 57496 KB ALTER INDEX [PK_HISTORY] ON [SCHEMA].[HISTORY] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 57496  Idx Size KB after 14320 KB ALTER INDEX [FK_HISTORY_REFERENCE_HISTORY_PARAM] ON [SCHEMA].[HISTORY] REBUILD
Executed: DB_NAME Frag 49 Idx Size KB before 7280  Idx Size KB after 7280 KB ALTER INDEX [PK_TABLE_SD] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 56 Idx Size KB before 7280  Idx Size KB after 7104 KB ALTER INDEX [TABLE_SD_IDX1] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 89 Idx Size KB before 7104  Idx Size KB after 6880 KB ALTER INDEX [TABLE_SD_IDX10] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 6880  Idx Size KB after 6672 KB ALTER INDEX [TABLE_SD_IDX11] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 6672  Idx Size KB after 6464 KB ALTER INDEX [TABLE_SD_IDX12] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 6464  Idx Size KB after 6256 KB ALTER INDEX [TABLE_SD_IDX13] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 6256  Idx Size KB after 6048 KB ALTER INDEX [TABLE_SD_IDX14] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 90 Idx Size KB before 6048  Idx Size KB after 5904 KB ALTER INDEX [TABLE_SD_IDX15] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 5904  Idx Size KB after 5768 KB ALTER INDEX [TABLE_SD_IDX16] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 82 Idx Size KB before 5768  Idx Size KB after 5376 KB ALTER INDEX [TABLE_SD_IDX2] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 53 Idx Size KB before 5376  Idx Size KB after 5224 KB ALTER INDEX [TABLE_SD_IDX3] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 79 Idx Size KB before 5224  Idx Size KB after 5128 KB ALTER INDEX [TABLE_SD_IDX4] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 79 Idx Size KB before 5128  Idx Size KB after 5032 KB ALTER INDEX [TABLE_SD_IDX5] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 88 Idx Size KB before 5032  Idx Size KB after 4896 KB ALTER INDEX [TABLE_SD_IDX6] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 81 Idx Size KB before 4896  Idx Size KB after 4760 KB ALTER INDEX [TABLE_SD_IDX7] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 89 Idx Size KB before 4760  Idx Size KB after 4616 KB ALTER INDEX [TABLE_SD_IDX8] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 87 Idx Size KB before 4616  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX9] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 40 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [Missing_IDX_TABLE_SD1] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 10480  Idx Size KB after 10464 KB ALTER INDEX [PK_LOCATION] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 72 Idx Size KB before 10464  Idx Size KB after 10016 KB ALTER INDEX [LOCATION_IDX1] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 91 Idx Size KB before 10016  Idx Size KB after 9728 KB ALTER INDEX [LOCATION_IDX10] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 9728  Idx Size KB after 9424 KB ALTER INDEX [LOCATION_IDX11] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 90 Idx Size KB before 9424  Idx Size KB after 8672 KB ALTER INDEX [LOCATION_IDX2] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 73 Idx Size KB before 8672  Idx Size KB after 8264 KB ALTER INDEX [LOCATION_IDX3] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 75 Idx Size KB before 8264  Idx Size KB after 8016 KB ALTER INDEX [LOCATION_IDX4] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 75 Idx Size KB before 8016  Idx Size KB after 7768 KB ALTER INDEX [LOCATION_IDX5] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 95 Idx Size KB before 7768  Idx Size KB after 7464 KB ALTER INDEX [LOCATION_IDX6] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 93 Idx Size KB before 7464  Idx Size KB after 7200 KB ALTER INDEX [LOCATION_IDX7] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 89 Idx Size KB before 7200  Idx Size KB after 6944 KB ALTER INDEX [LOCATION_IDX8] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 94 Idx Size KB before 6944  Idx Size KB after 5536 KB ALTER INDEX [LOCATION_IDX9] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 75 Idx Size KB before 5536  Idx Size KB after 5288 KB ALTER INDEX [FK_LOCATION_EMPLOYEE] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 73 Idx Size KB before 5288  Idx Size KB after 5040 KB ALTER INDEX [FK_LOCATION_LOCATION] ON [SCHEMA].[LOCATION] REBUILD
Executed: DB_NAME Frag 13 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [Missing_IDX_LOCATION1] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 89 Idx Size KB before 3408  Idx Size KB after 3408 KB ALTER INDEX [PK_SHARED_USE] ON [SCHEMA].[SHARED_USE] REBUILD
Executed: DB_NAME Frag 97 Idx Size KB before 3408  Idx Size KB after 2936 KB ALTER INDEX [FK_SHARED_USE_TAB_ASSET] ON [SCHEMA].[SHARED_USE] REBUILD
Executed: DB_NAME Frag 96 Idx Size KB before 2936  Idx Size KB after 2328 KB ALTER INDEX [FK_SHARED_USE_COST_CENTER] ON [SCHEMA].[SHARED_USE] REBUILD
Executed: DB_NAME Frag 97 Idx Size KB before 2328  Idx Size KB after 1800 KB ALTER INDEX [FK_SHARED_USE_DEPARTMENT] ON [SCHEMA].[SHARED_USE] REBUILD
Executed: DB_NAME Frag 91 Idx Size KB before 1800  Idx Size KB after 1288 KB ALTER INDEX [FK_SHARED_USE_EMPLOYEE] ON [SCHEMA].[SHARED_USE] REBUILD


2nd Run

Executed: DB_NAME Frag 75 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX10] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX11] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX4] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX5] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX6] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 50 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX7] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 50 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [DEPARTMENT_IDX8] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [FK_DEPARTMENT_COST_CENTER] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [FK_DEPARTMENT_DEPARTMENT] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 67 Idx Size KB before 1344  Idx Size KB after 1344 KB ALTER INDEX [FK_DEPARTMENT_EMPLOYEE] ON [SCHEMA].[DEPARTMENT] REBUILD
Executed: DB_NAME Frag 12 Idx Size KB before 1064  Idx Size KB after 1064 KB ALTER INDEX [FK_EMPLOYEE_DEPARTMENT] ON [SCHEMA].[EMPLOYEE] REORGANIZE
Executed: DB_NAME Frag 12 Idx Size KB before 1064  Idx Size KB after 1064 KB ALTER INDEX [FK_EMPLOYEE_LOCATION] ON [SCHEMA].[EMPLOYEE] REORGANIZE
Executed: DB_NAME Frag 12 Idx Size KB before 1064  Idx Size KB after 1064 KB ALTER INDEX [FK_EMPLOYEE_SCHEDULE] ON [SCHEMA].[EMPLOYEE] REORGANIZE
Executed: DB_NAME Frag 28 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX15] ON [SCHEMA].[TABLE_SD] REORGANIZE
Executed: DB_NAME Frag 43 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX16] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 86 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX4] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 58 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX5] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 58 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX6] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 45 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX7] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 34 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [TABLE_SD_IDX8] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 60 Idx Size KB before 4408  Idx Size KB after 4408 KB ALTER INDEX [Missing_IDX_TABLE_SD1] ON [SCHEMA].[TABLE_SD] REBUILD
Executed: DB_NAME Frag 24 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [LOCATION_IDX11] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 18 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [LOCATION_IDX4] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 30 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [LOCATION_IDX5] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 30 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [LOCATION_IDX6] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 14 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [LOCATION_IDX8] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 18 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [FK_LOCATION_EMPLOYEE] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 30 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [FK_LOCATION_LOCATION] ON [SCHEMA].[LOCATION] REORGANIZE
Executed: DB_NAME Frag 13 Idx Size KB before 5040  Idx Size KB after 5040 KB ALTER INDEX [Missing_IDX_LOCATION1] ON [SCHEMA].[LOCATION] REORGANIZE



1.4 Run it in some Databases

DECLARE @dbName VARCHAR(50) -- database name
DECLARE @sql NVARCHAR(MAX)
DECLARE db_cursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('CM_001','tempdb','model')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbName
WHILE @@FETCH_STATUS = 0
BEGIN
                SET @sql = N'USE ' + QUOTENAME(@dbName) + ' exec sp_adb_IndexMntc ''10'',''30'''
                EXEC sp_ExecuteSql @sql
    FETCH NEXT FROM db_cursor INTO @dbName
END
CLOSE db_cursor
DEALLOCATE db_cursor