Books and articles about SQL Rambler's Top100 Сменить язык на: Русский 09 July 2020 20:12:05


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Перестройка индексов онлайн в SQL Server 2005

Tim Chapman (оригинал: Rebuild indexes online with SQL Server 2005)
Перевод Моисеенко С.И.

Реорганизация или перестройка?

Фрагментированные индексы могут быть сделаны "нефрагментированными" двумя способами: они могут быть реорганизованы или перестроены. Реорганизация индекса вызывает переупорядочивание данных в наиболее удаленных страницах данных и уплотняет индекс. Никакие дополнительные данные не добавляются в индекс при реорганизации, поэтому индекс может остаться несколько фрагментированным. Операция не потребляет много ресурсов системы и может происходить, когда внешние процессы получают доступ к таблице, на которой работает этот индекс. Поэтому мы говорим в этом случае об "онлайновой' операции.

Перестройка индекса по существу уничтожает индекс и создает новый. Любая фрагментация, которая была в старом индексе, устраняется, и логический порядок нового индекса соответствует физическому порядку. Вследствие того, что индекс удаляется и создается вновь, внешние процессы не в состоянии получить доступ к таблице, что отрицательно сказывается на производительности. Фактически, другие процессы не будут в состоянии вообще заблокировать таблицу, пока идет процесс перестройки индекса. Это - главный недостаток перестройки индексов.

Перестройка индексов онлайн

В SQL Server 2005 появилась возможность перестаивать индексы в онлайн манере так, чтобы другие процессы могли быть в состоянии получить доступ к таблице во время перестройки индексов. Поскольку Вы можете получать доступ к индексам во время перестройки, Вы не ограничены при выполнении перестройки индексов только часами минимальной нагрузки на сервер.

Чтобы добиться этого, механизм базы данных предпринимает некоторые специальные действия, позволяющие перестраивать индекс и одновременно разрешать доступ к нему. Исходный индекс остается доступным для пользователей для выполнения чтения и модификации данных. Используется версионность строк, чтобы учесть последовательность транзакций. При перестройке создается новый индекс, который повторяет старый индекс. Любые модификации данных, которые изменяют оригинальный индекс, будут также применены к этому индексу SQL Server в процессе перестройки. Этот новый индекс вообще не читается - работает только на запись. Существенно, что Вы должны иметь достаточный объем свободного дискового пространства, чтобы хранить данные для двух параллельно существующих индексов в течение онлайн перестройки. В процессе перестройки SQL Server использует индекс отображения, чтобы определять записи, которые нужно модифицировать в новом индексе, когда их модификация происходит в исходном индексе. Как только процесс перестройки завершается, любые запросы или модификации данных переключаются на новый индекс, а исходный индекс удаляется.

Пример

Процедура перестройки индекса онлайн почти не отличается от типичной процедуры перестройки; однако есть несколько способов выполнить перестройку. Один способ состоит в том, чтобы просто удалить имеющийся индекс, используя оператор DROP INDEX, с последующим выполнением CREATE INDEX. Перестройка индексов таким способом оставляет таблицу без индекса до тех пор, пока индекс не будет полностью создан. По этой причине (и множеству других причин), удаление индекса и повторное его создание не рекомендуется.

Оператор CREATE INDEX все же может использоваться для перестройки индексов с опцией DROP_EXISTING. Эта возможность позволяет менять определение указанного индекса, и позволяет администратору базы данных изменять местоположение индекса, перенося его в другую файловую группу или раздел.

Оператор ALTER INDEX позволяет перестроить кластерный и все некластерные индексы на таблице. Недостаток этого оператора состоит в том, что Вы не можете изменить определение индекса. Оба эти оператора имеют опции, позволяющие перестраивать индексы онлайн.

Следующий оператор перестраивает кластерный индекс (на столбце SaleID) для таблицы SalesHistory. Существующий индекс удаляется в этом процессе, однако он будет доступен в течение операции, поскольку задана опция ONLINE.

 

CREATE CLUSTERED INDEX cl_SalesHistory_SaleID ON SalesHistory(SaleID)
 WITH(DROP_EXISTING = ON, ONLINE = ON)

 

Этот оператор весьма похож на предыдущий, но он изменяет имеющееся определение индекса, включая в индекс дополнительный столбец. Индекс перестраивается тем же самым способом.

 

CREATE CLUSTERED INDEX cl_SalesHistory_SaleID ON SalesHistory(SaleID ASC, SaleDate ASC)
 WITH(DROP_EXISTING = ON, ONLINE = ON)

 

Используя оператор ALTER INDEX, я могу перестроить все индексы на указанной таблице. Синтаксическая конструкция ONLINE имеет тот же смысл, что и для оператора CREATE INDEX. Эта новая конструкция заменяет оператор DBCC DBREINDEX, которая использовалась для этой цели в предыдущих версиях SQL Server

 

ALTER INDEX ALL ON SalesHistory
 REBUILD WITH(ONLINE = ON)

 

Этот оператор перестраивает кластерный индекс на таблице SalesHistory. Опция ONLINE опущена, что означает, что таблица не будет доступна в процессе операции перестройки.

 

ALTER INDEX cl_SalesHistory_SaleID ON SalesHistory
 REBUILD

 

Этот оператор аналогичен предыдущему, но перестройка будет выполнена онлайн, т.е. доступ к таблице не будет закрыт.

 

ALTER INDEX cl_SalesHistory_SaleID ON SalesHistory
 REBUILD WITH(ONLINE = ON)

 

Заключение

Возможность перестраивать индексы в SQL server 2005 обогатилась новой фантастической опцией. Если Вы перестраиваете ваши индексы онлайн, следует убедиться в том, что имеется достаточно свободного дискового пространства для хранения индекса, который создается, наряду со старым, пока еще существующим индексом. После процедуры перестройки старый индекс будет удален. Кроме того, перестройка индексов онлайн потребляет существенное больше времени и ресурсов, чем просто перестройка индекса. Это обычно довольно хорошая плата, поскольку таблица останется доступной в течение всей процедуры.

В следующей статье я покажу, как Вы можете использовать новые динамические функции управления SQL Server для анализа уровня фрагментации ваших индексов с целью определить необходимость перестройки.

10-12-2007

На главную страницу

Print  Версия для печати


Usage of any materials of this site is possible
only under condition of mandatory allocation of the direct link to a site
http://www.sqlbooks.ru
on each page where used materials are placed.

 Main   Articles    Books 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.