Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

Восстановление индексов

Компонент SQL Server Database Engine автоматически поддерживает состояние индексов при выполнении операций вставки, обновления или удаления в отношении базовых данных. Со временем эти изменения могут привести к тому, что данные в индексе окажутся фрагментированными (разбросанными по базе данных). Существуют два типа фрагментации:

  • внутренняя – внутренняя фрагментация означает неполное заполнение страниц индекса, что приводит к увеличению высоты сбалансированного дерева и, как следствие, росту количества операций ввода-вывода.

  • внешняя - имеет место в тех случаях, когда в индексах содержатся страницы, для которых логический порядок, основанный на значении ключа, не совпадает с физическим порядком в файле данных.

Значительно фрагментированные индексы могут серьезно снижать производительность запросов и служить причиной замедления откликов приложения.

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

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

Выявление фрагментации

Первым шагом в определении, какой метод дефрагментации следует использовать, будет анализ индекса на предмет степени фрагментации. Системная функция sys.dm_db_index_physical_stats позволяет выявить фрагментацию конкретного индекса, всех индексов в таблице или индексированном представлении, всех индексов в базе данных или всех индексов во всех базах данных. Для секционированных индексов sys.dm_db_index_physical_stats также предоставляет сведения о фрагментации каждой секции.

Результирующий набор, возвращаемый функцией sys.dm_db_index_physical_stats, включает следующие столбцы:

Столбец

Описание

avg_fragmentation_in_percent

Процентная доля логической фрагментации (неупорядоченные страницы в индексе).

fragment_count

Число фрагментов (физически последовательные конечные страницы) в индексе.

avg_fragment_size_in_pages

Среднее число страниц в одном фрагменте индекса.

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

avg_fragmentation_in_percent

Корректирующая инструкция

> 5 % и <= 30 %

ALTER INDEX REORGANIZE

> 30%

ALTER INDEX REBUILD

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

Пример:

Следующий пример запрашивает через функцию динамического управления sys.dm_db_index_physical_stats среднюю фрагментацию для всех индексов в таблице Cources. В соответствии с предыдущей таблицей, рекомендуемым решением проблемы будет реорганизация IX_Id_Unique_Clustered и перестроение IX_Unique_Code.

SELECT a.index_id, name, avg_fragmentation_in_percent

FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'Cources'), NULL, NULL, NULL) AS a

JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;

GO

Результат

index_id name avg_fragmentation_in_percent

------------------------------------------------------------------------------------------

1 IX_Id_Unique_Clustered 15.076923076923077

3 IX_Unique_Code 99.666666666666657

(2 row(s) affected)

Реорганизация индекса

Реорганизация индексов производится при помощи инструкции ALTER INDEX с предложением REORGANIZE. Это предложение эквивалентно DBCC INDEXDEFRAG.

Реорганизация индекса дефрагментирует конечный уровень кластеризованных и некластеризованных индексов по таблицам и представлениям, физически переупорядочивая страницы концевого уровня в соответствии с логическим порядком (слева направо) конечных узлов. Расположение страниц в правильном порядке улучшает производительность сканирования индекса. Индекс реорганизуется в пределах выделенных для него страниц, новые страницы не выделяются. Если индекс состоит из более чем одного файла, файлы реорганизуются поочередно. Страницы не перемещаются между файлами.

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

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

Перестроение индексов

Реорганизация индексов производится при помощи инструкции ALTER INDEX с предложением REBUILD. Это предложение эквивалентно DBCC DBREINDEX.

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

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

Чтобы добиться доступности, подобной варианту с реорганизацией, следует перестраивать индексы в режиме в сети – это означает, что базовые таблицы и связанные индексы будут доступны для запросов и изменения данных во время операций с индексами. Режим перестроения индекса в сети доступен только в редакциях SQL Server Enterprise и Developer.

При удалении или перестроении больших индексов (более чем из 128 экстентов) Database Engine откладывает фактическое освобождение страниц, избегая блокировки размещения, требуемой для удаления больших объектов, с помощью разделения процесса на две стадии: логическую и физическую.

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

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

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

Пример 1:

В следующем примере перестраивается один индекс в таблице Employee.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee

REBUILD;

GO

Пример 2:

В следующем примере указывается ключевое слово ALL. Тем самым выполняется перестроение всех индексов, связанных с таблицей.

ALTER INDEX ALL ON Production.Product

REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,

STATISTICS_NORECOMPUTE = ON);

GO

Соседние файлы в предмете Информатика