06июн
Формат блока в ORACLE.
Как на самом низком физическом уровне хранятся данные в СУРБД ORACLE? Какой размер блока? Какова структура и специфика информации содержащейся в блоке? Как распределяется пространство в блоке при создании таблицы? PCTFREE и PCTUSED - для чего это? Как оракл выделяет блоки для записи информации? Об этом данная статья
На самом низком уровне данные ORACLE хранит в блоках данных (логические блоки, блоки ORACLE, страницы). Блок данных содержит фиксированное число байт физического пространства на диске. Размер блока данных устанавливается для каждой базы данных ORACLE при ее создании. Этот размер кратен размеру блока операционной системы. И что особенно важно, база данных распределяет свободное пространство блоками данных ORACLE, в отличие от операционной системы, где распределение пространства проводится в байтах. То есть ORACLE управляет пространством в файлах данных наименьшей единицей ввода-вывода - блоком данных.
Очень красиво и доступно на эту тему материал изложен у Тома Кайта. Поэтому я имею наглость привести выдержку из его книги:
Блок — наименьшая единица выделения пространства в Oracle. В блоках и хранятся строки данных, индексов или промежуточные результаты сортировок. Именно блоками сервер Oracle обычно выполняет чтение и запись на диск. Блоки в Oracle бывают размером 2 Кбайт, 4 Кбайт или 8 Кбайт (хотя допустимы также блоки размером 16 Кбайт и 32 Кбайт). Отношения между сегментами, экстентами и блоками показаны на следующей схеме:

Сегмент состоит из одного или более экстентов, а экстент — это группа следующих подряд блоков. Размер блока в базе данных с момента ее создания — величина постоянная, поэтому все блоки в базе данных одного размера. Формат блока представлен ниже.

Заголовок блока содержит информацию о типе блока (блок таблицы, блок индекса и т.д.), информацию о текущих и прежних транзакциях (см. подробнее статью «Типы блокировок»), затронувших блок, а также адрес (местонахождение) блока на диске. Каталог таблиц содержит информацию о таблицах, строки которых хранятся в этом блоке (в блоке могут храниться данные нескольких таблиц). Каталог строк содержит описание хранящихся в блоке строк (включая адреса каждой порции строки в области данных строк). Это массив указателей на строки, хранящиеся в области данных блока. Вместе эти три части блока называются служебным пространством блока. Это пространство недоступно для данных и используется сервером Oracle для управления блоком. Остальные две части блока вполне понятны: в блоке имеется занятое пространство, в котором хранятся данные, и может быть свободное пространство.
Для работы с данными очень важно знать, что такое PCTFREE и PCTUSED и как с ними бороться. Эти параметры указываются при создании и изменении таблиц (команды alter и create) и позволяют управлять свободным пространством блока данных. PCTFREE можно также указывать при создании или изменении индексов.
Параметр PCTFREE устанавливает процент памяти блока, оставляемой свободной для будущих обновлений строк, которые уже находятся в блоке.
Например, если в команде CREATE TABLE указан PCTFREE 10, то это значит, что 10% пространства в каждом блоке данных будет оставаться свободным и предназначаться для обновлений тех строк, которые есть в блоке.
Блок данных будет заполняться до тех пор, пока свободными останутся только указанный в параметре PCTFREE процент блока. После этого данные вставляться не будут в этот блок до тех пор, пока процент используемого пространства не станет меньше, чем указано в параметре PCTUSED.
Например, если в команде CREATE TABLE указано PCTUSED 40, то после заполнения блока данных до PCTFREE, он не будет использоваться для вставки новых записей, пока процент занятой памяти в блоке не упадет до 39% или ниже.
Таким образом, мы имеет следующую картину:
В новом блоке для вставок есть место равное размеру блока минус PCTFREE и размер заголовка блока. Для обновления существующих данных можно использовать все свободное пространство в блоке; поэтому обновления могут сделать свободное пространство в блоке меньшим, чем PCTFREE.
Для каждого сегмента данных и сегмента индекса ORACLE поддерживает списки свободных для вставки блоков, т.е. таких блоков, у которых процент свободной памяти больше, чем PCTFREE.
Когда необходимо выполнить INSERT, ORACLE ищет в свободном списке первый доступный блок и использует его. Если свободного пространства в этом блоке становится мало, чтобы сделать INSERT, то этот блок удаляется из списка.
Когда выполняются DELETE и UPDATE, ORACLE проверяет, если используемое место становится меньше чем PCTUSED, то блок передвигается в начало списков свободных блоков.
Память, которая освобождается после delete или update (если значение изменяется на меньшее), доступна для INSERT в текущей или зафиксированной транзакции.
Освобождаемое пространство не всегда граничит с областью свободного пространства в блоке. Сжатие свободного пространства происходит только тогда,когда UPDATE или INSERT использует блок, содержащий достаточно свободного места, для размещения новых данных, но нет непрерывного участка блока. Так реализовано для того, чтобы не снижать производительность системы от ненужных сжатий.
Есть еще такое понятие как цепочки строк между блоками данных: строка не умещается в один блок данных (имеющие, например, столбцы с большими типами объектов). В таких случаях цепочки избежать невозможно.
Если строка обновляется так, что не помещается в блоке и свободное пространство в блоке заполнено, то строка переносится в новый блок данных (мигрирующая строка). А на прежнем месте записывается указатель на новый блок. ROWID строки при этом не меняется.
Следует знать, что чтение цепочек блоков и мигрирующих строк снижает производительность ввода-вывода, так как в этих случаях приходиться читать больше одного блока для выборки строки. С этим нужно по возможности бороться