Назад | Перейти на главную страницу

Oracle 10 g - Невозможно освободить место в табличном пространстве

Табличное пространство в Oracle 10g используется почти на 100%.

Размер (МБ) = 571 768,0 Используемый (МБ) = 571 534,0

Я только что удалил (и зафиксировал) тысячи записей в таблице, которая принадлежит схеме, связанной с этим табличным пространством. Удивительно, но согласно странице «Табличные пространства» в Enterprise Manager не было освобождено место.

Вопрос: что мне нужно сделать, чтобы заставить Oracle освободить пространство, соответствующее удаленным записям?

alter table {table_name} разрешить перемещение строк;

изменить размер таблицы {table_name};

Страница, которую вы просматриваете в Enterprise Manager, почти наверняка сообщает о свободном пространстве, сравнивая DBA_DATA_FILES (который сообщает вам общие размеры различных файлов, выделенных для табличного пространства) с DBA_SEGMENTS (который сообщает вам общий размер всех сегментов, выделенных объектам в табличном пространстве). Это не изменится просто потому, что вы удалили некоторые данные.

Когда вы удаляете данные, вы освобождаете место в блоках и экстентах, выделенных конкретному объекту. Таким образом, если вы удалите 100 МБ данных из таблицы FOO (и связанных индексов FOO), размер сегмента FOO не уменьшится. Но теперь в этом сегменте было бы место, на которое можно было бы разместить еще 100 МБ вставок в FOO. Если вы удаляете пространство из FOO, чтобы освободить место для других сегментов в табличном пространстве, вам нужно будет реорганизовать FOO после удаления данных - это несколько сложный процесс, который, вероятно, потребует времени простоя, а также небольшого тестирования. . Если вы не уменьшаете размер объекта постоянно, это обычно не рекомендуется - если FOO в конечном итоге увидит еще 100 МБ вставок, нецелесообразно сжимать сегмент FOO только для того, чтобы он снова увеличился.

Вы можете использовать пакет DBMS_SPACE, чтобы узнать, сколько места доступно в разных сегментах. Это расскажет вам о пустых блоках, а также о блоках, которые находятся в различных состояниях заполнения (0-25% заполнено, 25-50% заполнено, 50-75% заполнено и 75-100% заполнено). При удалении данных обычно увеличивается количество пустых и частично пустых блоков, выделенных для таблицы.

Как продолжение принятого ответа, вы можете использовать Советчик по сегментам (через вызов dbms_advisor), чтобы оценить экономию места при выполнении операции сжатия пространства. [Для работы советника по сегментам вам не нужен пакет лицензий]

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

Обычно лучше создать временную таблицу как create table temp_table name как select * from table_you_deleted_from; затем отбросьте индексы исходной таблицы, отключите ограничение, указывающее на эту таблицу, а затем отбросьте и воссоздайте эту таблицу снова как create table table_you_deleted_from name как select * from temp_table; воссоздайте индексы и включите ограничения.

Здесь вы в основном уменьшили размер таблицы и длину дерева индексов, то есть ускорили повторное выполнение запроса.