Управление дисковым пространством, занятым объектами

Страница карты распределения индекса (Index Allocation Map, IAM) сопоставляет экстенты в 4-гигабайтном фрагменте файла базы данных с используемой единицей распределения. Единица распределения может иметь один из трех типов.

  • IN_ROW_DATA

    Содержит секцию кучи или индекса.

  • LOB_DATA

    Содержит типы данных больших объектов (LOB), например: xml, varbinary(max) или varchar(max).

  • ROW_OVERFLOW_DATA

    Содержит данные переменной длины, которые хранятся в столбцах varchar, nvarchar, varbinary или sql_variant и превышают допустимый размер строки 8060 байт.

В каждой секции кучи или индекса содержится по крайней мере одна единица распределения IN_ROW_DATA. Кроме того, в зависимости от схемы кучи или индекса, там могут содержаться единицы распределения LOB_DATA или ROW_OVERFLOW_DATA. Дополнительные сведения о единицах распределения см. в разделе Организация таблиц и индексов.

IAM-страница охватывает в файле диапазон 4 ГБ, то есть столько же, сколько и GAM- или SGAM-страница. Если в единице распределения содержатся экстенты из более чем одного файла или фрагмент файла размером более 4 ГБ, то несколько IAM-страниц будут объединены в IAM-цепочку. Таким образом, каждая единица распределения содержит как минимум одну IAM-страницу для каждого из файлов, в которых содержатся ее экстенты. Для файла может существовать несколько IAM-страниц, если размер экстентов файла, назначенного единице распределения, превышает объем, который может быть записан в одной IAM-странице.

Экстенты, управляющие IAM-страницами

IAM-страницы для каждой единицы распределения выделяются по необходимости и располагаются в файле в случайном порядке. Системное представление sys.system_internals_allocation_units указывает на первую IAM-страницу единицы распределения. Все IAM-страницы, относящиеся к одной единице распределения, объединяются в цепочку.

Важное примечаниеВажно!

Системное представление sys.system_internals_allocation_units предназначено только для внутреннего использования и может быть изменено. Совместимость не гарантируется.

IAM-страницы, связанные в цепочки для единиц распределения

IAM-страница имеет заголовок, отражающий первый экстент из диапазона, сопоставленного с данной IAM-страницей. IAM-страница также имеет большую битовую карту, в которой каждый бит представляет экстент. Первый бит схемы представляет первый экстент диапазона, второй бит — второй экстент и т. д. Если бит равен 0, то соответствующий ему экстент не привязан к единице распределения, которой принадлежит IAM-страница. Если он равен 1, то соответствующий ему экстент привязан к единице распределения, которой принадлежит IAM-страница.

Когда требуется вставить новую строку, но на текущей странице нет свободного места, компонент SQL Server Database Engine через IAM и PFS ищет страницу для выделения или (для страниц кучи, или текста и изображения) страницу, в которой достаточно места для хранения строки данных. Используя IAM-страницы, компонент Database Engine находит экстенты, привязанные к единице распределения. Для каждого экстента компонент Database Engine просматривает PFS-страницы, чтобы определить наличие доступных страниц. Огромное число страниц данных содержатся в сравнительно небольшом числе IAM- и PFS-страниц. Поэтому обычно IAM- и PFS-страницы находятся в памяти буферного пула SQL Server, и поиск в них осуществляется очень быстро. Для индексов место вставки новой строки определяется ключом индекса. В этом случае описанный ранее процесс поиска не производится.

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