Управление пространством в базе данных. Выделение, освобождение и размер экстентов, страница 7

·  Большинство информации о распределении экстентов не объединено в список. Каждая страница может быть выделена или освобождена достаточно быстро, что уменьшает соперничество между параллельными задачами, требующими выделения свободных страниц.

SQL Server использует две карты распределения, в которых хранит информацию о распределении экстентов:

·  Глобальная карта распределения (Global Allocation MapGAM) содержит информацию о выделенных экстентах. Каждая GAM покрывает 64 000 экстентов и использует по одному биту для каждого экстента:

o  значение бита равно 1 – экстент является свободным,

o  значение бита равно 0 – в противном случае.

·  Разделяемая глобальная карта распределения (Shared Global Allocation MapSGAM) содержит информацию об экстентах, которые в настоящее время используются как смешанные экстенты и имеют хотя бы одну неиспользуемую страницу. Каждая SGAM покрывает 64 000 экстентов и использует по одному биту для каждого экстента:

o  значение бита равно 1 – экстент является смешанным и имеет свободные страницы,

o  значение бита равно 0 – экстент является однородным или является смешанным, но не имеет свободных страниц.

Экстент

Значение соответствующего бита GAM

Значение

соответствующего бита SGAM

Свободный

1

0

Однородный или

смешанный, но без свободных страниц

0

0

Смешанный со свободными страницами

0

1

Алгоритм управления экстентами является достаточно простым и в первом приближении выглядит следующим образом:

·  Чтобы выделить объекту однородный экстент, SQL Server ищет в GAM бит, значение которого равно единице и устанавливает его в ноль.

·  Чтобы найти смешанный экстент со свободными страницами, SQL Server ищет в SGAM бит, значение которого равно единице.

·  Чтобы выделить смешанный экстент, SQL Server ищет в GAM бит, значение которого равно единице, устанавливает его в ноль, затем устанавливает в единицу соответствующий бит SGAM.

·  Чтобы освободить экстент, SQL Server устанавливает значение соответствующего бита GAM в единицу, а SGAM – в ноль.

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

Страницы, содержащие информацию о свободном пространстве страниц (Page Free SpacePFS), указывают, выделена конкретная страница для хипа, или для данных типа ntext, text, или image, а также количество свободного места на каждой странице. Каждая страница PFS покрывает примерно 8 000 страниц. Для каждой страницы в диапазоне покрытия PFS содержит битовую карту, показывающую является ли страница пустой, заполненной на 1-50%, 51-80%, 81-95% или 96-100%.

После того, как экстент выделен объекту, SQL Server использует страницы PFS для хранения информации о том, какие страницы экстента являются свободными и как много свободного пространства доступно для использования. Эта информация используется, когда SQL Server должен выделить новую страницу или когда он должен найти страницу со свободным пространством для вставки новой строки.

Страница PFS, покрывающая первые 8 000 страниц, является первой страницей файла после страницы заголовка файла, далее следуют страницы GAM и SGAM, покрывающие первые 64 000 экстентов. После этого следует страница PFS, покрывающая следующие 8 000 страниц, затем GAM и SGAM, покрывающие следующие 64 000 экстентов (см. Рисунок 5).

Рисунок 5 Размещение системных страниц в файле данных SQL Server

Управление пространством, используемым объектами базы данных SQL Server

Страницы карты распределения индексов (Index Allocation MapIAM) содержат информацию об экстентах в файле данных, используемых хипами или индексами. Страницы IAM также содержат информацию об экстентах, выделенных для списка страниц ntext, text и image любого объекта, имеющего колонки такого типа. Каждый из таких объектов имеет список, состоящий из одной или более страниц IAM, содержащих информацию о выделенных для объекта экстентах. Каждый объект имеет, по крайней мере, одну страницу IAM для каждого файла данных, в котором он имеет свои экстенты. Страниц IAM в файле может быть несколько, если диапазон экстентов в файле, выделенных объекту, превышает диапазон, который может быть описан в одной странице IAM.

Страницы IAM распределены в файле данных случайным образом. Указатели на первую страницу IAM для объектов находятся в системной таблице sysindexes, все остальные страницы IAM для объекта объединены в список.

Размещение страниц данных

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

Каждой таблице и индексу в sysindexes соответствует строка, которая уникально идентифицируется комбинацией колонок id (идентификатор объекта) и  indid (идентификатор индекса). Размещением страниц в таблице и индексе управляет список IAM-страниц. Колонка  FirstIAM таблицы sysindexes указывает на первую IAM-страницу из списка IAM-страниц, управляющих пространством, выделенным для таблицы или индекса.

В sysindexes каждая таблица имеет множество строк:

§  для хипа значение indid = 0;

§  для кластерного индекса значение indid = 1;