Для управления свободным пространством блока существуют два параметра команды CREATE TABLE:
- PCTFREE;
- PCTUSED.
Параметры задаются при создании или изменении таблиц (индексов).
Параметр PCTFREE устанавливает процент зарезервированного в блоке пространства для последующих возможных обновлений строк этого блока.
Параметр PCTUSED устанавливает процент использованного пространства, по достижению которого возможно добавление новых строк в блок (предполагается, что пространство блока предварительно заполнено до значения PCTFREE, а затем блок постепенно освобождался).
Оба параметра подбираются таким образом, чтобы оптимизировать утилизацию пространства в блоках данных.
Пространство для обновления во вновь выделяемом блоке:
Обновление существующих данных может использовать всё доступное пространство блока, оно может сделать свободное пространство в блоке меньше, чем зарезервированное PCTFREE.
Для каждого сегмента данных и индексов Oracle ведёт список свободных блоков, имеющих свободное пространство больше, чем PCTFREE. Блок перемещается в начало списка свободных блоков и становится первым доступным для использования, если свободное пространство стало меньше, чем PCTUSED.
Свободное пространство в блок возвращают команды DELETE и UPDATE. При этом освобождённое пространство необязательно непрерывно. Пространство объединяется только в том случае, когда свободного пространства в блоке достаточно, чтобы поместить туда результат команды, но это пространство фрагментировано.
Это делается для того, чтобы не снижать производительность системы, выполняя, возможно, ненужные сжатия после каждой команды DELENE и UPDATE.
Естественно, если сумма значений PCTFREE и PCTUSED слишком близка к 100, то блоки будут включаться в список свободных и исключаться из него очень часто.
Самым эффективным способом вернуть в работу пространство, занятое в таблице удалёнными строками – вывести таблицу из работы и реорганизовать.
Расщеплённые и мигрирующие строки
Расщеплённая строка – строка, части которой находятся в разных блоках данных.
Для расщеплённых строк создаются цепочки блоков. Идентификатор строки (ROWID) и столбцов этой части строки хранятся в заголовке блока.
Мигрирующая строка – строка, которая перемещена в другой блок. Эта проблема может быть связана с выбором PCTFREE, а также размером блока.
Расщепление и миграция строк снижает производительность, т.к. для просмотра данных строки Oracle требуется чтение более одного блока, что увеличивает число дисковых операций ввода-вывода.