Maintain database indexes
You can just create script or run right now the reindex. Verify the configuration to filter databases or to change the FILLFACTOR.
1
2PRINT '-- ***************************************** --'
3PRINT '-- Reindex all tables'
4PRINT '-- on selected databases'
5PRINT '-- ***************************************** --'
6PRINT '--'
7PRINT '/*'
8PRINT @@servername;
9PRINT Getdate();
10PRINT '*/'
11SET NOCOUNT ON;
12
13-- CONFIGURATION
14DECLARE @runScriptRightNow INT = 0;
15DECLARE @fillfactor AS NVARCHAR(10) = '99' -- occuped% -- <a href="https://docs.microsoft.com/en-us/sql/relational-databases/indexes/specify-fill-factor-for-an-index">https://docs.microsoft.com/en-us/sql/relational-databases/indexes/specify-fill-factor-for-an-index</a>
16BEGIN TRY DROP TABLE #dbs; END TRY BEGIN CATCH END CATCH;
17SELECT [name] INTO #dbs FROM sys.databases
18WHERE database_id > 4
19AND name NOT IN ('MyDatabaseNoReindex')
20ORDER BY [name]
21
22-- CONFIGURATION
23
24USE [MASTER];
25
26DECLARE @dbname nvarchar(200);
27DECLARE @sql NVARCHAR(MAX);
28DECLARE @ToKill AS NVARCHAR(MAX);
29
30DECLARE @templateSelectTable AS NVARCHAR(MAX) = 'SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' + table_name + '']'' as tableName FROM [$(dbname)].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''
31DECLARE @templateReindex AS NVARCHAR(MAX) ='ALTER INDEX ALL ON $(tablename) REBUILD WITH (FILLFACTOR = $(fillfactor));'
32SET @templateReindex = REPLACE(@templateReindex,'$(fillfactor)',@fillfactor)
33
34DECLARE @table AS table (TableName nvarchar(256))
35DECLARE @script AS table (Idx int identity,SqlScript nvarchar(max))
36DECLARE @Idx int;
37DECLARE @SqlScript nvarchar(max)
38WHILE (EXISTS(SELECT * FROM #dbs))
39BEGIN
40
41 SELECT TOP 1 @dbname = name FROM #dbs;
42 DELETE FROM #dbs WHERE name = @dbname;
43
44 SET @sql = REPLACE(@templateSelectTable,'$(dbname)',@dbname);
45 DELETE FROM @table;
46 INSERT INTO @table (TableName)
47 EXEC(@sql)
48
49 INSERT INTO @script(SqlScript)
50 select REPLACE(@templateReindex,'$(tablename)',TableName) from @table;
51
52 WHILE (EXISTS(SELECT * FROM @script))
53 BEGIN
54 SELECT TOP 1 @Idx = Idx, @SqlScript = SqlScript FROM @script t;
55 DELETE FROM @script WHERE Idx = @Idx;
56
57 IF (@runScriptRightNow = 1)
58 BEGIN
59 RAISERROR (@SqlScript, 10, 1) WITH NOWAIT;
60 EXEC (@SqlScript);
61 END
62 ELSE
63 PRINT @SqlScript
64 END
65
66END
Same code with safe mode and try again
1
2GO
3PRINT '-- ***************************************** --'
4PRINT '-- Reindex all tables with safe mode'
5PRINT '-- on selected databases'
6PRINT '-- ***************************************** --'
7PRINT '--'
8PRINT '-- ' +@@servername;
9PRINT '-- ' +cast(Getdate() as nvarchar(100));
10SET NOCOUNT ON;
11
12-- CONFIGURATION
13DECLARE @runScriptRightNow INT = 1;
14DECLARE @fillfactor AS NVARCHAR(10) = '98' -- occuped% -- https://docs.microsoft.com/en-us/sql/relational-databases/indexes/specify-fill-factor-for-an-index
15
16BEGIN TRY DROP TABLE #dbs; END TRY BEGIN CATCH END CATCH;
17SELECT [name] INTO #dbs FROM sys.databases
18WHERE database_id > 4
19AND name IN ('MyDatabaseNoReindex')
20ORDER BY [name]
21
22-- CONFIGURATION$(ESCAPE_NONE(dbname))
23
24USE [MASTER];
25
26DECLARE @dbname nvarchar(200);
27DECLARE @sql NVARCHAR(MAX);
28DECLARE @ToKill AS NVARCHAR(MAX);
29
30DECLARE @templateSelectTable AS NVARCHAR(MAX) = 'SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' + table_name + '']'' as tableName FROM [[#dbname]].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''
31DECLARE @templateReindex AS NVARCHAR(MAX) ='
32DECLARE @tryAgain INT = 2;
33WHILE (@tryAgain>0)
34BEGIN
35 BEGIN TRY
36 PRINT ''-- REINDEX Table : [#tablename]'';
37 ALTER INDEX ALL ON [#tablename] REBUILD WITH (FILLFACTOR = [#fillfactor]));
38 END TRY
39 BEGIN CATCH
40 SET @tryAgain = @tryAgain - 1;
41 WAITFOR DELAY ''00:00:10'';
42 CONTINUE;
43 END CATCH
44 BREAK;
45END;
46'
47SET @templateReindex = REPLACE(@templateReindex,'[#fillfactor])',@fillfactor)
48
49DECLARE @table AS table (TableName nvarchar(256))
50DECLARE @script AS table (Idx int identity,SqlScript nvarchar(max))
51DECLARE @Idx int;
52DECLARE @SqlScript nvarchar(max)
53WHILE (EXISTS(SELECT * FROM #dbs))
54BEGIN
55
56 SELECT TOP 1 @dbname = name FROM #dbs;
57 DELETE FROM #dbs WHERE name = @dbname;
58
59 SET @sql = REPLACE(@templateSelectTable,'[#dbname]',@dbname);
60 DELETE FROM @table;
61 INSERT INTO @table (TableName)
62 EXEC(@sql)
63
64 INSERT INTO @script(SqlScript)
65 select REPLACE(@templateReindex,'[#tablename]',TableName) from @table;
66
67 WHILE (EXISTS(SELECT * FROM @script))
68 BEGIN
69 SELECT TOP 1 @Idx = Idx, @SqlScript = SqlScript FROM @script t;
70 DELETE FROM @script WHERE Idx = @Idx;
71
72 IF (@runScriptRightNow = 1)
73 BEGIN
74 RAISERROR (@SqlScript, 10, 1) WITH NOWAIT;
75 RAISERROR ('GO', 10, 1) WITH NOWAIT;
76 EXEC (@SqlScript);
77 END
78 ELSE
79 PRINT @SqlScript
80 END
81
82END
83GO
Sources :
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/specify-fill-factor-for-an-index https://www.mssqltips.com/sqlservertip/1367/sql-server-script-to-rebuild-all-indexes-for-all-tables-and-all-databases/
Comments