logo
SQL2008_Administration

8.4.6. Устранение фрагментации индексов и таблиц

Перестроение индексов, для устранения фрагментации:

Дефрагментацию индексов можно производить разными способами:

  1. С помощью команды ALTER INDEX ... REBUILD можно выполнить перестроение конкретного индекса или группы индексов указанной таблицы или представления. Эта команда полностью удаляет существующий индекс или индексы и создает их заново, устраняя всякую фрагментацию. Например:

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD

ALTER INDEX ALL ON HumanResources.Employee REBUILD

При перестроении некластерного индекса его можно отключить командой ALTER INDEX DISABLE — в результате места на диске для этой операции потребуется намного меньше.

  1. Для перестроения всех индексов для всех таблиц в БД необходимо использовать программный код (скрипт Transact-SQL или воспользоваться возможностями объектных моделей SMO или SQL-DMO). Например:

EXEC sp_deframent_indexes 80.00

Dim oServer, oDB, oTable

Set oServer = CreateObject("SQLDmo.SqlServer2")

oServer.LoginSecure = True

oServer.Connect "LONDON\SQL2008"

Set oDB = oServer.Databases("Northwind")

For Each oTable In oDB.Tables

If oTable.SystemObject = False Then oTable.RebuildIndexes

Next

  1. С помощью графического интерфейса SQL Server Management Studio можно выполнить перестроение конкретного индекса или всех индексов выбранной таблицы: из контекстного меню индекса или контейнера Indexes выбрать команду Rebuild.

Реорганизация индексов, для устранения фрагментации:

Перестроение индексов — операция достаточно тяжелая. Она требует большого количества времени и места на диске, при этом пользователи не могут работать с таблицами, для которых производится такое перестроение. Поэтому во многих ситуациях есть смысл произвести не перестроение, а реорганизацию индексов.

  1. При помощи команды ALTER INDEX ... REORGANIZE производится дефрагментация только страниц самого нижнего уровня индекса (листовых). Например:

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REORGANIZE

  1. С помощью графического интерфейса SQL Server Management Studio можно выполнить реорганизацию конкретного индекса или всех индексов выбранной таблицы: из контекстного меню индекса или контейнера Indexes (Индексы) выбрать команду Reorganize (Реорганизовать).

Проблема:

При перестроении индексов статистика автоматически не обновляется. Поэтому выполнение практически любого запроса к базе данных будет приводить к автоматическому перерасчету статистики. Если вы производите перестроение индексов на регулярной основе, рекомендуется после завершения этой операции сразу произвести обновление статистики во всей базе данных.

Например, в скрипт SQL-DMO нужно добавить единственную строку с вызовом метода UpdateStatistics():

Dim oServer, oDB, oTable

Set oServer = CreateObject("SQLDmo.SqlServer2")

oServer.LoginSecure = True

oServer.Connect "LONDON2\SQL2008"

Set oDB = oServer.Databases("AdventureWorks")

For Each oTable In oDB.Tables

If oTable.SystemObject = False Then

oTable.RebuildIndexes

oTable.UpdateStatistics

End if

Next