Оглавление
IndexOptimize — это наверное самая необходима процедура, так как позволят выполнять регламентное обслуживание баз данных с гибкими параметрами от команды Ola Hallengren. Я использую ее на рабочем сервере в качестве небольшого оптимизатора — реорганизации и пересчета статистики в дневные час, когда нагрузка не высокая и можно подготовиться к вечернему спринту. Чем отличается rebuld от reindex можно прочитать на сайте Microsoft
Параметры
Databases
Выбор баз. В качестве аргументов, отвечающих за выбор объектов, можно передать SYSTEM_DATABASES, USER_DATABASES, ALL_DATABASES и AVAILABILITY_GROUP_DATABASES, если поддерживается. Знак (-) используется для исключения базы, а знак процента (%) выполняет роль символа подстановки. Все используемые параметры могут быть разделены занятой (,)
Переменная | Описание |
---|---|
SYSTEM_DATABASES | Все системные базы (master, msdb, and model) |
USER_DATABASES | Все пользовательские базы |
ALL_DATABASES | Все базы |
AVAILABILITY_GROUP_DATABASES | Все базы и группы доступности |
USER_DATABASES, -AVAILABILITY_GROUP_DATABASES | Все пользовательские базы и исключая группы доступности |
Db1 | База данных Db1 |
Db1, Db2 | Базы данных Db1 и Db2 |
USER_DATABASES, -Db1 | Все пользовательские базы, за исключением Db1 |
%Db% | Все базы, имеющие в названии Db |
%Db%, -Db1 | Все базы имеющие в названии Db, за исключением базы Db1 |
ALL_DATABASES, -%Db% | Все базы, за исключением тех, которые имеют в названии Db |
FragmentationLow
Параметры указывают операции с индексом, имеющим низкий уровень фрагментации.
Переменная | Описание |
---|---|
INDEX_REBUILD_ONLINE | Перестроение (rebuild) индекса online |
INDEX_REBUILD_OFFLINE | Перестроение (rebuild) индекса offline |
INDEX_REORGANIZE | Реорганизация индекса |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Перестроение индекса онлайн. Перестроить индекс в автономном режиме, если онлайн-перестройка не поддерживается индексом |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Перестройте индекс онлайн. Реорганизовать индекс, если онлайн-перестройка не поддерживается индексом |
INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,
INDEX_REBUILD_OFFLINE |
Реорганизовать индекс. Перестройка индекса онлайн, если реорганизация не поддерживается индексом. Перестроить индекс в автономном режиме, если реорганизация и онлайн-перестройка не поддерживаются индексом |
NULL | Не выполнять обслуживание индекса. Это значение по умолчанию для индекса с низкой фрагментацией |
Ребилд или реорганизация индекса не всегда возможны. Поэтому вы можете указать несколько операций обслуживания индекса. Эти операции приоритетны слева направо: если первая операция поддерживается для индекса, то эта операция используется; если первая операция не поддерживается, то используется вторая операция (если поддерживается) и т. д. Если ни одна из указанных операций не поддерживается для индекса, то этот индекс не поддерживается.
Процедура IndexOptimize использует команду SQL Server ALTER INDEX: REBUILD WITH (ONLINE = ON) ребилд индекса online, REBUILD WITH (ONLINE = OFF) ребилд индекса offline, и REORGANIZE реорганизация индекса.
FragmentationMedium
Параметры указывают операции с индексом, имеющим средний уровень фрагментации. Данный параметр имеет схожие переменные с FragmentationLow
Переменная | Описание |
---|---|
INDEX_REBUILD_ONLINE | Перестроение (rebuild) индекса online |
INDEX_REBUILD_OFFLINE | Перестроение (rebuild) индекса offline |
INDEX_REORGANIZE | Реорганизация индекса |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Перестроение индекса онлайн. Перестроить индекс в автономном режиме, если онлайн-перестройка не поддерживается индексом |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Перестройте индекс онлайн. Реорганизовать индекс, если онлайн-перестройка не поддерживается индексом |
INDEX_REORGANIZE,
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE |
Реорганизовать индекс. Перестройка индекса онлайн, если реорганизация не поддерживается индексом. Перестроить индекс в автономном режиме, если реорганизация и онлайн-перестройка не поддерживаются индексом |
NULL | Не выполнять обслуживание индекса. Это значение по умолчанию для индекса со средней фрагментацией |
Ребилд или реорганизация индекса не всегда возможны. Поэтому вы можете указать несколько операций обслуживания индекса. Эти операции приоритетны слева направо: если первая операция поддерживается для индекса, то эта операция используется; если первая операция не поддерживается, то используется вторая операция (если поддерживается) и т. д. Если ни одна из указанных операций не поддерживается для индекса, то этот индекс не поддерживается.
Процедура IndexOptimize использует команду SQL Server ALTER INDEX: REBUILD WITH (ONLINE = ON) перестроение индекса online, REBUILD WITH (ONLINE = OFF) перестроение индекса offline и REORGANIZE реорганизация индекса.
FragmentationHigh
Параметры указывают операции с индексом, имеющим высокий уровень фрагментации. Данный параметр имеет схожие переменные с FragmentationLow и FragmentationMedium
Переменная | Описание |
---|---|
INDEX_REBUILD_ONLINE | Перестроение (rebuild) индекса online |
INDEX_REBUILD_OFFLINE | Перестроение (rebuild) индекса offline |
INDEX_REORGANIZE | Реорганизация индекса |
INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE | Перестроение индекса онлайн. Перестроить индекс в автономном режиме, если онлайн-перестройка не поддерживается индексом |
INDEX_REBUILD_ONLINE,INDEX_REORGANIZE | Перестройте индекс онлайн. Реорганизовать индекс, если онлайн-перестройка не поддерживается индексом |
INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,
INDEX_REBUILD_OFFLINE |
Реорганизовать индекс. Перестройка индекса онлайн, если реорганизация не поддерживается индексом. Перестроить индекс в автономном режиме, если реорганизация и онлайн-перестройка не поддерживаются индексом |
NULL | Не выполнять обслуживание индекса. Это значение по умолчанию для индекса со высокой фрагментацией |
Ребилд или реорганизация индекса не всегда возможны. Поэтому вы можете указать несколько операций обслуживания индекса. Эти операции приоритетны слева направо: если первая операция поддерживается для индекса, то эта операция используется; если первая операция не поддерживается, то используется вторая операция (если поддерживается) и т. д. Если ни одна из указанных операций не поддерживается для индекса, то этот индекс не поддерживается.
Процедура IndexOptimize использует команду SQL Server ALTER INDEX: REBUILD WITH (ONLINE = ON) перестроение индекса online, REBUILD WITH (ONLINE = OFF) перестроение индекса offline и REORGANIZE реорганизация индекса.
FragmentationLevel1
Установите нижний предел в процентах для средней фрагментации. Значение по умолчанию — 5 процентов. Это основано на рекомендации Microsoft в электронной документации — Books Online. IndexOptimize проверяет avg_fragmentation_in_percent в sys.dm_db_index_physical_stats, чтобы определить фрагментацию.
FragmentationLevel2
Установите нижний предел в процентах для высокой фрагментации. Значение по умолчанию — 30 процентов. Это основано на рекомендации Microsoft в электронной документации — Books Online. IndexOptimize проверяет avg_fragmentation_in_percent в sys.dm_db_index_physical_stats, чтобы определить фрагментацию.
PageCountLevel
Задайте размер, на страницах; индексы с меньшим количеством страниц исключаются из обслуживания. По умолчанию используется 1000 страниц. Это основано на рекомендации Microsoft. IndexOptimize проверяет page_count в sys.dm_db_index_physical_stats, чтобы определить размер индекса.
SortInTempdb
Использовать tempdb для операций сортировки при восстановлении индексов.
Переменная | Описание |
---|---|
Y | Использовать |
N | Не использовать. По умолчанию |
Переменная SortInTempdb в процедуре IndexOptimize использует команду SQL Server ALTER INDEX. Это очень интересный параметр, так как позволят задействовать быстрые дисковые массивы, выделенные под tempdb. Если файловые группы настроены верно для tempdb, то не стоит волноваться о их переполнении или замедлении работы сервера. Тут есть пару хитростей, о которых я постараюсь рассказать по завершении оформления статьи.
MaxDOP
Количество ядер процессора выделенных для проверки базы, файловой группы или таблицы. Если данный параметр не задан, будут использоваться максимальное значение степени параллелизма. Параметр MaxDOP использует команду SQL Server ALTER INDEX. Иногда просто необходимо ограничивать количество потоков, которое использует SQL Server. Такое бывает, если регламент выполняется в рабочее время и необходимо обеспечить незначительное снижение производительности.
FillFactor
Укажите в процентах, насколько полные страницы должны быть сделаны при восстановлении индексов. Если процент не указан, используется коэффициент заполнения в sys.indexes. Параметр FillFactor использует команду SQL Server ALTER INDEX. Данный параметр бывает полезен если необходимо снизить коэффициент авто расширения. Т.е. место в таблице будет резервироваться заранее.
PadIndex
Применить процент свободного места, который коэффициент заполнения указывает на страницы промежуточного уровня индекса.
Переменная | Описание |
---|---|
Y | Применять |
N | Не применять. По умолчанию |
Параметр FillFactor использует команду SQL Server ALTER INDEX.
LOBCompaction
Сжимать страницы, содержащие столбцы больших объектов (LOB) при реорганизации индексов.
Переменная | Описание |
---|---|
Y | Сжимать. По умолчанию |
N | Не сжимать |
Параметр LOBCompaction использует команду SQL Server ALTER INDEX.
UpdateStatistics
Обновление статистики. Важно помнить, что при реорганизации (rebuild), выполнять пересчет статистики нет необходимости! А вот при реиндексации это делать необходимо.
Переменная | Описание |
---|---|
ALL | Обновлять статистику индексов и таблиц |
INDEX | Обновление статистики индексов |
COLUMNS | Обновление статистики таблиц |
NULL | Не обновлять статистику. По умолчанию |
Процедура IndexOptimize использует команду SQL Server UPDATE STATISTICS.
OnlyModifiedStatistics
Обновлять статистику только в том случае, если какие-либо строки были изменены с момента последнего обновления статистики
Переменная | Описание |
---|---|
Y | Обновлять статистику только в том случае, если с момента последнего обновления статистики были изменены какие-либо строки |
N | Обновлять статистику независимо от того, были ли изменены какие-либо строки |
IndexOptimize проверяет update_counter в sys.dm_db_stats_properties в SQL Server 2008 R2, начиная с Service Pack 2 и SQL Server 2012, начиная с Service Pack 1, чтобы определить, были ли изменены какие-либо строки с момента последнего обновления статистики. В более ранних версиях он проверяет rowmodctr в sys.sysindexes.
StatisticsSample
Укажите в процентах, сколько таблицы собрано при обновлении статистики. Значение 100 эквивалентно полному сканированию. Если значение не указано, SQL Server автоматически вычисляет требуемый образец.
Параметр StatisticsSample использует параметры SAMPLE и FULLSCAN команды SQL Server UPDATE STATISTICS.
StatisticsResample
Обновите статистику с помощью последнего образца.
Переменная | Описание |
---|---|
Y | Обновление статистики с помощью последней выборки. |
N | Пусть SQL Server автоматически вычислит требуемый образец. По умолчанию |
Параметр StatisticsResample использует параметр RESAMPLE команды SQL Server UPDATE STATISTICS. Вы не можете комбинировать параметры StatisticsSample и StatisticsResample
PartitionLevel
Ведение секционированных индексов на уровне раздела. Если для этого параметра установлено значение Y, уровень фрагментации и количество страниц проверяется для каждого раздела. Затем для каждого раздела выполняется соответствующее обслуживание индекса (реорганизация или перестройка).
Переменная | Описание |
---|---|
Y | Ведение секционированных индексов на уровне раздела. По умолчанию |
N | Ведение секционированных индексов на уровне индекса |
MSShippedObjects
Ведение индексов и статистики по объектам, созданным внутренними компонентами SQL Server
Переменная | Описание |
---|---|
Y | Ведение индексов и статистики по объектам, созданным внутренними компонентами SQL Server |
N | Не поддерживать индексы и статистику по объектам, созданным внутренними компонентами SQL Server. Это значение по умолчанию. |
IndexOptimize проверяет is_ms_shipped в sys.objects, чтобы определить, был ли объект создан внутренним компонентом SQL Server.
Indexes
Позволет выбрать определенные индексы. Если индексы не указаны, то выбираются все. Поддерживается маска поиска. Знак (-) используется для исключения базы, а знак процента (%) выполняет роль символа подстановки. Все используемые параметры могут быть разделены занятой (,)
Переменная | Описание |
---|---|
ALL_INDEXES | Все индексы |
Db1.Schema1.Tbl1.Idx1 | Индекс Idx1 на объекте Schema1.Tbl1 в базе данных Db1 |
Db1.Schema1.Tbl1.Idx1, Db2.Schema2.Tbl2.Idx2 | Индекс Idx1 на объекте Schema1.Tbl1 в базе данных Db1 и индекс Idx2 на объекте Schema2.Tbl2 в базе данных Db2 |
Db1.Schema1.Tbl1 | Все индексы объекта Schema1.Tbl1 в базе данных Db1 |
Db1.Schema1.Tbl1, Db2.Schema2.Tbl2 | Все индексы на объекте Schema1.Tbl1 в базе данных Db1 и все индексы объекта Schema2.Tbl2 в базе данных Db2 |
Db1.Schema1.% | Все индексы в схеме Schema1 в базе данных Db1 |
%.Schema1.% | Все индексы в схеме Schema1 во всех базах данных |
ALL_INDEXES, -Db1.Schema1.Tbl1.Idx1 | Все индексы, кроме индекса Idx1, на объекте Schema1.Tbl1 в базе данных Db1 |
ALL_INDEXES, -Db1.Schema1.Tbl1 | Все индексы, кроме индексов объекта Schema1.Tbl1 в базе данных Db1 |
TimeLimit
Установите время, в секундах, после которого команды не выполняются. По умолчанию время не ограничено.
Delay
Установите задержку в секундах между командами индекса. По умолчанию нет задержки.
WaitAtLowPriorityMaxDuration
Время, в минутах, для операции по перестроению индекса online, на блокировку с низким приоритетом.
Параметр WaitAtLowPriorityMaxDuration использует параметр SQL Server WAIT_AT_LOW_PRIORITY и MAX_DURATION команды ALTER INDEX.
WaitAtLowPriorityAbortAfterWait
Действие, которое будет выполняться после операции ожидания блокировки с низким приоритетом на перестроение индекса online
Переменная | Описание |
---|---|
NONE | Продолжать ждать блокировок с нормальным приоритетом |
SELF | Прервать операцию по перестроению индекса online |
BLOCKERS | Убитье транзакции пользователя, которые блокируют операцию перестроение индекса online |
Параметр WaitAtLowPriorityAbortAfterWait использует WAIT_AT_LOW_PRIORITY и ABORT_AFTER_WAIT команды ALTER INDEX.
AvailabilityGroups
Выбор групп доступности. Поддерживается маска поиска. Знак (-) используется для исключения базы, а знак процента (%) выполняет роль символа подстановки. Все используемые параметры могут быть разделены занятой (,)
Переменная | Описание |
---|---|
ALL_AVAILABILITY_GROUPS | Все группы доступности |
AG1 | Группа доступности AG1 |
AG1, AG2 | Группы доступности AG1 и AG1 |
ALL_AVAILABILITY_GROUPS, -AG1 | Все группы доступности, кроме AG1 |
%AG% | Все группы доступности, содержащие в своем имени “AG” |
%AG%, -AG1 | Все группы доступности содержащие в своем имени “AG”, кроме AG1 |
ALL_AVAILABILITY_GROUPS, -%AG% | Все группы доступности, за исключением групп, содержащих в имени AG |
LockTimeout
Устанавливет время в секундах, чтобы команда ожидала освобождения блокировки. По умолчанию время не ограничено.
Данная команда использует параметр SET LOCK_TIMEOUT установленный в SQL Server.
LogToTable
Вести лог в таблицу dbo.CommandLog.
Переменная | Описание |
---|---|
Y | Лог команд сохранять в dbo.CommandLog |
N | Не сохранять лог. По умолчанию |
Execute
Выполнить команды. По умолчанию команды выполняются нормально. Если этот параметр установлен в N, то команды только выводятся на экран.
Переменная | Описание |
---|---|
Y | Выполнять команды. По умолчанию |
N | Только напечатать команды |
Примеры
A. Перестроить или реорганизовать все индексы с фрагментацией во всех пользовательских базах данных
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. Перестроить или реорганизовать все индексы с фрагментацией и обновить измененную статистику по всем пользовательским базам данных
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. Обновить статистику во всех пользовательских базах
EXECUTE dbo.IndexOptimize
@Databases = ‘USER_DATABASES’,
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = ‘ALL’
D. Обновление измененной статистики по всем пользовательским базам данных
EXECUTE dbo.IndexOptimize
@Databases = ‘USER_DATABASES’,
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@UpdateStatistics = ‘ALL’,
@OnlyModifiedStatistics = ‘Y’
E. Перестроить или реорганизовать все индексы с фрагментацией во всех пользовательских базах данных, выполнить операции сортировки в tempdb и использовать все доступные процессоры
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,
@SortInTempdb = ‘Y’,
@MaxDOP = 0
F. Перестроить или реорганизовать все индексы с фрагментацией во всех пользовательских базах данных, используя опцию для поддержки секционированных индексов на уровне раздела
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,
@PartitionLevel = ‘Y’
G. Перестроить или реорганизовать все индексы с фрагментацией во всех пользовательских базах данных с ограничением по времени, чтобы никакие команды не выполнялись после 3600 секунд
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,
@TimeLimit = 3600
H. Перестроить или реорганизовать все индексы с фрагментацией на таблицу Production.Product в базе данных AdventureWorks
EXECUTE dbo.IndexOptimize
@Databases = ‘AdventureWorks’,
@FragmentationLow = NULL,
@FragmentationMedium = ‘INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE’,
@FragmentationHigh = ‘INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE’,
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@Indexes = ‘AdventureWorks.Production.Product’
I. Перестроить или реорганизовать все индексы с фрагментацией, за исключением индексов в таблице. Production.Product в базе данных AdventureWorks
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,
@Indexes = ‘ALL_INDEXES, -AdventureWorks.Production.Product’
J. Перестройте или реорганизуйте все индексы с фрагментацией во всех пользовательских базах данных и запишите результаты в таблицу
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,
@LogToTable = ‘Y’
Выполнение
Выполните хранимые процедуры из заданий SQL Server Agent CmdExec, используя sqlcmd и -b. Передайте параметры хранимым процедурам по имени:
1 2 3 |
sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES'" -b |