
Табличное пространство в Oracle 10g используется почти на 100%.
Размер (МБ) = 571,768.0 Использовано (МБ) = 571,534.0
Я только что удалил (и зафиксировал) тысячи записей в таблице, которая принадлежит схеме, связанной с этим табличным пространством. Удивительно, но, согласно странице Табличные пространства в Enterprise Manager, не освободилось никакого места.
Вопрос: нужно ли что-то сделать, чтобы заставить Oracle освободить пространство, соответствующее удаленным записям?
решение1
изменить таблицу {table_name} включить перемещение строк;
изменить таблицу {table_name} уменьшить пространство;
решение2
Страница, которую вы просматриваете в 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% заполнены). Когда вы удаляете данные, вы, как правило, вызываете увеличение количества пустых и частично пустых блоков, выделенных для таблицы.
решение3
В качестве дополнения к принятому ответу вы можете использовать Segment Advisor (через вызов dbms_advisor) для оценки экономии места при выполнении операции сжатия пространства. [Вам не нужен пакет лицензий для запуска Segment Advisor]
Тогда вы сможете сэкономить время и просто сосредоточиться на тех сегментах, где вы получите наибольшую выгоду.
решение4
Обычно лучше создать временную таблицу, как create table temp_table name as select * from table_you_deleted_from; затем удалить индексы в исходной таблице, отключить ограничения, указывающие на эту таблицу, а затем удалить и заново создать эту таблицу, как create table table_you_deleted_from name as select * from temp_table; заново создать индексы и включить ограничения.
Здесь вы по сути уменьшили размер таблицы и длину дерева индекса, т.е. ускорили поиск в будущем.