Oracle 10g - Não é possível liberar espaço no tablespace

Oracle 10g - Não é possível liberar espaço no tablespace

O espaço de tabela no Oracle 10g é quase 100% utilizado.

Tamanho (MB) = 571.768,0 Usado (MB) = 571.534,0

Acabei de excluir (e confirmar) milhares de registros em uma tabela que pertence a um esquema associado a esse espaço de tabela. Surpreendentemente, nenhum espaço foi liberado de acordo com a página Tablespaces no Enterprise Manager.

Pergunta: há algo que eu precise fazer para forçar o Oracle a liberar o espaço correspondente aos registros deletados?

Responder1

alter table {table_name} ativa o movimento de linha;

alter table {table_name} diminui o espaço;

Responder2

A página que você está vendo no Enterprise Manager quase certamente informa o espaço livre comparando DBA_DATA_FILES(que informa os tamanhos totais dos vários arquivos alocados para um espaço de tabela) com DBA_SEGMENTS(que informa o tamanho total de todos os segmentos alocados para objetos no espaço de tabela). Isso não mudará simplesmente porque você excluiu alguns dados.

Ao excluir dados, você libera espaço nos blocos e extensões alocados para um objeto específico. Portanto, se você excluir 100 MB de dados da tabela FOO (e dos índices FOO associados), o tamanho do segmento FOO não diminuirá. Mas agora haveria espaço nesse segmento que acomodaria outros 100 MB de inserções no FOO. Se você estiver excluindo espaço do FOO para liberar espaço para outros segmentos no espaço de tabela, será necessário reorganizar o FOO após excluir os dados - este é um processo um tanto complicado que provavelmente requer tempo de inatividade, bem como alguns testes. . A menos que você esteja reduzindo permanentemente o tamanho de um objeto, geralmente não é aconselhável - se o FOO eventualmente ver outros 100 MB de inserções, não é benéfico reduzir o segmento FOO apenas para que ele cresça novamente.

Você pode usar o pacote DBMS_SPACE para ver quanto espaço está disponível em diferentes segmentos. Isso informará sobre blocos vazios, bem como blocos que estão em vários estados de preenchimento (0-25% cheios, 25-50% cheios, 50-75% cheios e 75-100% cheios). Ao excluir dados, geralmente você causa um aumento no número de blocos vazios e parcialmente vazios alocados para uma tabela.

Responder3

Assim como uma continuação da resposta aceita, você pode usar o Segment Advisor (por meio de uma chamada para dbms_advisor) para estimar a economia de espaço ao executar a operação de redução de espaço. [Você não precisa de um pacote de licenças para executar o consultor de segmento]

Você poderia então economizar algum tempo e direcionar apenas os segmentos onde obteria mais benefícios.

Responder4

Normalmente é melhor criar uma tabela temporária como create table temp_table name como select * from table_you_deleted_from; em seguida, elimine os índices na tabela original, desative a restrição apontando para essa tabela e, em seguida, elimine e recrie esta tabela novamente como criar tabela table_you_deleted_from nome como select * from temp_table; recrie seus índices e ative as restrições.

Aqui você basicamente reduziu o tamanho da tabela e o comprimento da árvore de índice, ou seja, uma recuperação mais rápida daqui para frente.

informação relacionada