Resource Link:
http://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
IndexOptimize is the SQL Server Maintenance Solution’s stored procedure for rebuilding and reorganizing indexes and updating statistics. IndexOptimize is supported on SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, and SQL Server 2012.
Download
Download MaintenanceSolution.sql. This script creates all the objects and jobs that you need. You can also download the objects as separate scripts.License
The SQL Server Maintenance Solution is free.Support
Request professional support or custom modifications.Parameters
Databases
Select databases. The keywords SYSTEM_DATABASES, USER_DATABASES, and ALL_DATABASES are supported. The hyphen character (-) is used to exclude databases, and the percent character (%) is used for wildcard selection. All of these operations can be combined by using the comma (,).Value | Description |
---|---|
SYSTEM_DATABASES | All system databases (master, msdb, and model) |
USER_DATABASES | All user databases |
ALL_DATABASES | All databases |
Db1 | The database Db1 |
Db1, Db2 | The databases Db1 and Db2 |
USER_DATABASES, -Db1 | All user databases, except Db1 |
%Db% | All databases that have “Db” in the name |
%Db%, -Db1 | All databases that have “Db” in the name, except Db1 |
ALL_DATABASES, -%Db% | All databases that do not have “Db” in the name |
FragmentationLow
Specify index maintenance operations to be performed on a low-fragmented index.Value | Description |
---|---|
INDEX_REBUILD_ONLINE | Rebuild index online. |
INDEX_REBUILD_OFFLINE | Rebuild index offline. |
INDEX_REORGANIZE | Reorganize index. |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Rebuild index online. Rebuild index offline if online rebuilding is not supported on an index. |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Rebuild index online. Reorganize index if online rebuilding is not supported on an index. |
INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Reorganize index. Rebuild index online if reorganizing is not supported on an index. Rebuild index offline if reorganizing and online rebuilding are not supported on an index. |
NULL | Do not perform index maintenance. This is the default for a low-fragmented index. |
IndexOptimize uses the SQL Server ALTER INDEX command: REBUILD WITH (ONLINE = ON) to rebuild indexes online, REBUILD WITH (ONLINE = OFF) to rebuild indexes offline, and REORGANIZE to reorganize indexes.
FragmentationMedium
Specify index maintenance operations to be performed on a medium-fragmented index.Value | Description |
---|---|
INDEX_REBUILD_ONLINE | Rebuild index online. |
INDEX_REBUILD_OFFLINE | Rebuild index offline. |
INDEX_REORGANIZE | Reorganize index. |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Rebuild index online. Rebuild index offline if online rebuilding is not supported on an index. |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Rebuild index online. Reorganize index if online rebuilding is not supported on an index. |
INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Reorganize index. Rebuild index online if reorganizing is not supported on an index. Rebuild index offline if reorganizing and online rebuilding are not supported on an index. This is the default for a medium-fragmented index. |
NULL | Do not perform index maintenance. |
IndexOptimize uses the SQL Server ALTER INDEX command: REBUILD WITH (ONLINE = ON) to rebuild indexes online, REBUILD WITH (ONLINE = OFF) to rebuild indexes offline, and REORGANIZE to reorganize indexes.
FragmentationHigh
Specify index maintenance operations to be performed on a high-fragmented index.Value | Description |
---|---|
INDEX_REBUILD_ONLINE | Rebuild index online. |
INDEX_REBUILD_OFFLINE | Rebuild index offline. |
INDEX_REORGANIZE | Reorganize index. |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Rebuild index online. Rebuild index offline if online rebuilding is not supported on an index. This is the default for a high-fragmented index. |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Rebuild index online. Reorganize index if online rebuilding is not supported on an index. |
INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Reorganize index. Rebuild index online if reorganizing is not supported on an index. Rebuild index offline if reorganizing and online rebuilding are not supported on an index. |
NULL | Do not perform index maintenance. |
IndexOptimize uses the SQL Server ALTER INDEX command: REBUILD WITH (ONLINE = ON) to rebuild indexes online, REBUILD WITH (ONLINE = OFF) to rebuild indexes offline, and REORGANIZE to reorganize indexes.
FragmentationLevel1
Set the lower limit, as a percentage, for medium fragmentation. The default is 5 percent. This is based on Microsoft’s recommendation in Books Online.IndexOptimize checks avg_fragmentation_in_percent in sys.dm_db_index_physical_stats to determine the fragmentation.
FragmentationLevel2
Set the lower limit, as a percentage, for high fragmentation. The default is 30 percent. This is based on Microsoft’s recommendation in Books Online.IndexOptimize checks avg_fragmentation_in_percent in sys.dm_db_index_physical_stats to determine the fragmentation.
PageCountLevel
Set a size, in pages; indexes with fewer pages are skipped for index maintenance. The default is 1000 pages. This is based on Microsoft’s recommendation in this white paper.IndexOptimize checks page_count in sys.dm_db_index_physical_stats to determine the size of the index.
SortInTempdb
Use tempdb for sort operations when rebuilding indexes.Value | Description |
---|---|
Y | Use tempdb for sort operations when rebuilding indexes. |
N | Do not use tempdb for sort operations when rebuilding indexes. This is the default. |
MaxDOP
Specify the number of CPUs to use when rebuilding indexes. If this number is not specified, the global maximum degree of parallelism is used.The MaxDOP option in IndexOptimize uses the MAXDOP option in the SQL Server ALTER INDEX command.
FillFactor
Indicate, as a percentage, how full the pages should be made when rebuilding indexes. If a percentage is not specified, the fill factor in sys.indexes is used.The FillFactor option in IndexOptimize uses the FILLFACTOR option in the SQL Server ALTER INDEX command.
PadIndex
Apply the percentage of free space that the FillFactor parameter specifies to the intermediate-level pages of the index.Value | Description |
---|---|
Y | Apply the percentage of free space that the FillFactor parameter specifies to the intermediate-level pages of the index. |
N | The intermediate-level pages of the index are filled to near capacity. This is the default. |
LOBCompaction
Compact pages that contain large object (LOB) columns, when reorganizing indexes.Value | Description |
---|---|
Y | Compact pages that contain LOB columns, when reorganizing indexes. This is the default. |
N | Do not compact pages that contain LOB columns, when reorganizing indexes. |
UpdateStatistics
Update statistics.Value | Description |
---|---|
ALL | Update index and column statistics. |
INDEX | Update index statistics. |
COLUMNS | Update column statistics. |
NULL | Do not perform statistics maintenance. This is the default. |
StatisticsSample
Indicate, as a percentage, how much of a table is gathered when updating statistics. A value of 100 is equivalent to a full scan. If no value is specified, then SQL Server automatically computes the required sample.The StatisticsSample option in IndexOptimize uses the SAMPLE and FULLSCAN options in the SQL Server UPDATE STATISTICS command.
StatisticsResample
Update statistics with the most recent sample.Value | Description |
---|---|
Y | Update statistics with the most recent sample. |
N | Let SQL Server automatically compute the required sample. This is the default. |
You cannot combine the options StatisticsSample and StatisticsResample.
OnlyModifiedStatistics
Update statistics only if any rows have been modified since the most recent statistics update.Value | Description |
---|---|
Y | Update statistics only if any rows have been modified since the most recent statistics update. |
N | Update statistics regardless of whether any rows have been modified. |
PartitionLevel
Maintain partitioned indexes on the partition level. If this parameter is set to Y, the fragmentation level and page count is checked for each partition. The appropriate index maintenance (rebuild or reorganize) is then performed for each partition.Value | Description |
---|---|
Y | Maintain partitioned indexes on the partition level. |
N | Maintain partitioned indexes on the index level. This is the default. |
TimeLimit
Set the time, in seconds, after which no commands are executed. By default, the time is not limited.Indexes
Select indexes. If this parameter is not specified, all indexes are selected. The ALL_INDEXES keyword is supported. The hyphen character (-) is used to exclude indexes, and the percent character (%) is used for wildcard selection. All these operations can be combined by using the comma (,).Value | Description |
---|---|
ALL_INDEXES | All indexes |
Db1.Schema1.Tbl1.Idx1 | The index Idx1 on the object Schema1.Tbl1 in the database Db1 |
Db1.Schema1.Tbl1.Idx1, Db2.Schema2.Tbl2.Idx2 | The index Idx1 on the object Schema1.Tbl1 in the database Db1 and the index Idx2 on the object Schema2.Tbl2 in the database Db2 |
Db1.Schema1.Tbl1 | All indexes on the object Schema1.Tbl1 in the database Db1 |
Db1.Schema1.Tbl1, Db2.Schema2.Tbl2 | All indexes on the object Schema1.Tbl1 in the database Db1 and all indexes on the object Schema2.Tbl2 in the database Db2 |
Db1.Schema1.% | All indexes in the schema Schema1 in the database Db1 |
%.Schema1.% | All indexes in the schema Schema1 in all databases |
ALL_INDEXES, -Db1.Schema1.Tbl1.Idx1 | All indexes except the index Idx1 on the object Schema1.Tbl1 in the database Db1 |
ALL_INDEXES, -Db1.Schema1.Tbl1 | All indexes except indexes on the object Schema1.Tbl1 in the database Db1 |
Delay
Set the delay, in seconds, between index commands. By default, there is no delay.LogToTable
Log commands to the table dbo.CommandLog.Value | Description |
---|---|
Y | Log commands to the table. |
N | Do not log commands to the table. This is the default. |
Execute
Execute commands. By default, the commands are executed normally. If this parameter is set to N, then the commands are printed only.Value | Description |
---|---|
Y | Execute commands. This is the default. |
N | Only print commands. |
Examples
A. Rebuild or reorganize indexes with fragmentation on all user databases
EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES',@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30
B. Rebuild or reorganize indexes with fragmentation and update modified statistics on all user databases
EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES',@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
C. Update modified statistics on all user databases
EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES',@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
Execution
Execute the stored procedures from SQL Server Agent CmdExec jobs, using sqlcmd and the -b option. Pass the parameters to the stored procedures by name:sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES'" -b
Use SQL Server Agent job output files with tokens for jobid, stepid, date, and time. Output files ensure that you always have a full set of information, in case of an error. Tokens ensure that the output files have unique file names.
You can use the MaintenanceSolution.sql script to install the SQL Server Maintenance Solution. Then the sqlcmd commands and the output files with tokens will be configured for you.
Getting Started
- Download MaintenanceSolution.sql.
- Execute MaintenanceSolution.sql. This script creates all the objects and jobs that you need.
- Go into [SQL Server Agent] / [Jobs] and start the jobs that have been created. Verify that these jobs are completing successfully. Check the output files in the error log directory.
- Schedule the jobs.
Upgrading
- Download MaintenanceSolution.sql.
- Change this line in the script so as not to create jobs:
SET @CreateJobs = 'N' - Execute MaintenanceSolution.sql. The script drops the old versions of the stored procedures and functions and creates new versions.
- Start the jobs and verify that they are completing successfully.
0 comments:
Post a Comment