How To: Reindex tables in a specific order
You can choose the order in which tables will be maintained. For example, let’s say that you want two tables in [YourDatabase] to be indexed before all other tables in that database, in this order:
- dbo.[Best] (it’s the most important or most badly fragmented table)
- dbo.[Okay]
- other tables
In this case, we would insert a row into the Minion.IndexSettingsTable for each one of the databases, specifying either ReindexGroupOrder, ReindexOrder, or both, as needed.
NOTE: For ReindexGroupOrder and ReindexOrder, higher numbers have a greater "weight" - they have a higher priority - and will be indexed earlier than lower numbers. Note also that these columns are TINYINT, so weighted values must fall between 0 and 255.
NOTE: When you insert a row for a table, the settings in that row override all of the default index maintenance settings for that table. So, inserting a row for [YourDatabase].dbo.[Best] means that ONLY those specified index settings will be used for that table; no settings defined in Minion.IndexSettingsDB will apply to those specific tables.
NOTE: Any non-specified tables will have a ReindexGroupOrder of 0, and a ReindexOrder of 0, by default. (Order settings at the database level have no effect on table-level ordering.)
Because we have so few tables in this example, the simplest method is to assign the heaviest "weight" to dbo.[Best], and lesser weights to dbo.[Okay]. In our example, we would insert two rows:
-- Insert IndexSettingsDB row for dbo.[Best], ReindexOrder=255 (first)
INSERT INTO [Minion].[IndexSettingsTable]
( [DBName] ,
[SchemaName] ,
[TableName] ,
[Exclude] ,
[ReindexGroupOrder] ,
[ReindexOrder] ,
[ReorgThreshold] ,
[RebuildThreshold] ,
[FILLFACTORopt] ,
[PadIndex] ,
[GetRowCT] ,
[GetPostFragLevel] ,
[UpdateStatsOnDefrag] ,
[LogIndexPhysicalStats] ,
[IndexScanMode] ,
[LogProgress] ,
[LogRetDays] ,
[IncludeUsageDetails]
)
VALUES ( 'YourDatabase' , -- DBName
'dbo' , -- SchemaName
'Best' , -- TableName
0 , -- Exclude
0 , -- ReindexGroupOrder
255 , -- ReindexOrder
10 , -- ReorgThreshold
20 , -- RebuildThreshold
80 , -- FILLFACTORopt
'ON' , -- PadIndex
1 , -- GetRowCT
1 , -- GetPostFragLevel
1 , -- UpdateStatsOnDefrag
0 , -- LogIndexPhysicalStats
'Limited' , -- IndexScanMode
1 , -- LogProgress
60 , -- LogRetDays
1 -- IncludeUsageDetails
);-- Insert IndexSettingsDB row for dbo.[Okay], ReindexOrder=200 (after [Best])
INSERT INTO [Minion].[IndexSettingsTable]
( [DBName] ,
[SchemaName] ,
[TableName] ,
[Exclude] ,
[ReindexGroupOrder] ,
[ReindexOrder] ,
[ReorgThreshold] ,
[RebuildThreshold] ,
[FILLFACTORopt] ,
[PadIndex] ,
[GetRowCT] ,
[GetPostFragLevel] ,
[UpdateStatsOnDefrag] ,
[LogIndexPhysicalStats] ,
[IndexScanMode] ,
[LogProgress] ,
[LogRetDays] ,
[IncludeUsageDetails]
)
VALUES ( 'YourDatabase' , -- DBName
'dbo' , -- SchemaName
'Okay' , -- TableName
0 , -- Exclude
0 , -- ReindexGroupOrder
200 , -- ReindexOrder
10 , -- ReorgThreshold
20 , -- RebuildThreshold
80 , -- FILLFACTORopt
'ON' , -- PadIndex
1 , -- GetRowCT
1 , -- GetPostFragLevel
1 , -- UpdateStatsOnDefrag
0 , -- LogIndexPhysicalStats
'Limited' , -- IndexScanMode
1 , -- LogProgress
60 , -- LogRetDays
1 -- IncludeUsageDetails
);For a more complex ordering scheme, we could divide tables up into groups, and then order the reindexing both by group, and within each group. The pseudocode for this example might be:
- [YourDatabase] (it’s the most important database on your system)
- [Semi]
- [Lame]
- [Unused]
GroupOrderGroupDBOrder
- Insert rows for databases YourDatabase and Semi, both with GroupOrder = 200
- Row YourDatabase: GroupDBOrder = 255
- Row Semi: GroupDBOrder = 100
- Insert rows for databases Lame and Unused, both with GroupOrder = 100
- Row YourDatabase: Lame = 255
- Row Semi: Unused = 100
The resulting backup order would be as follows:
- YourDatabase
- Semi
- Lame
- Unused