Этот вопрос старый, но никогда не имел рабочего ответа и может быть полезен для многих людей, поэтому вот решение, которое я нашел, столкнувшись с этой проблемой.
Вы правы, удаление LOB не приведет к восстановлению хранилища в табличном пейзаже.
Выполнение этого запроса до и после удаления LOB даст одинаковый результат
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
Чтение это Oracle doc, я обнаружил, что вам нужно выполнить следующую инструкцию
ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE);
Что сократит BASICFILE
сегмент LOB.
Теперь, если вы повторно выполните запрос
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
Вы заметите, что пространство было освобождено для табличного пространства, и сможете повторно использовать это пространство по своему усмотрению.
Теперь для тех, кто хотел бы освободить место на диске, обратите внимание, что файл данных не будет автоматически изменен в размере и все равно будет содержать полный размер на вашем диске.
Но перед изменением размера файла данных убедитесь, что вы освободили неиспользуемое пространство в сегменте (украли его из того же документа, как указано выше), используя эти запросы (используйте тот, который вам нужен)
ALTER TABLE table DEALLOCATE UNUSED KEEP integer;
ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;
Обратите внимание, что предложение KEEP
является необязательным и позволяет указать объем пространства, оставшегося в сегменте. Вы можете убедиться, что освобожденное пространство освобождено, изучив представление DBA_FREE_SPACE
.
Теперь, чтобы изменить размер вашего файла данных,
ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M
Обратите внимание, что максимальный размер, который вы можете уменьшить при изменении размера, зависит от положения последнего блока данных в вашем файле данных. Поэтому существует большая вероятность, что после удаления большого количества данных вы не сможете изменить размер. Затем самый простой способ - экспортировать данные и повторно импортировать их в другое табличное пространство, а затем удалить старое табличное пространство. При импорте данных Oracle упаковывает их как можно больше.
Если вы хотите освободить еще больше места, вы можете очистить временное табличное пространство, которое иногда занимает много места (5 ГБ для моей базы данных). Используйте следующий оператор, чтобы проверить его размер:
SELECT tablespace_name, file_name, bytes
FROM dba_temp_files WHERE tablespace_name like 'TEMP%';