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

2

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

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 excluídos?

    
por b.roth 14.07.2009 / 18:24

4 respostas

4

alterar a tabela {table_name} para ativar o movimento de linhas;

alter table {table_name} reduza o espaço;

    
por 14.07.2009 / 20:58
2

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

Quando você exclui dados, libera espaço nos blocos e extensões alocados a um objeto específico. Portanto, se você excluir dados de 100 MB da tabela FOO (e índices FOO associados), o tamanho do segmento FOO não diminuiria. 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 tablespace, você precisaria reorganizar o FOO após excluir os dados - este é um processo um tanto envolvido que provavelmente requer tempo de inatividade, bem como um bom teste . A menos que você esteja reduzindo permanentemente o tamanho de um objeto, geralmente não é aconselhável - se o FOO eventualmente for ver outros 100 MB de inserções, não é benéfico encolher 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 a 25% completos, 25 a 50% cheios, 50 a 75% cheios e 75 a 100% cheios). Quando você exclui dados, geralmente causará um aumento no número de blocos vazios e parcialmente vazios alocados a uma tabela.

    
por 14.07.2009 / 19:56
1

Assim como um acompanhamento da resposta aceita, você pode usar o Consultor de Segmentos (por meio de uma chamada para dbms_advisor) para estimar a economia de espaço da execução da operação de espaço de contração. [Você não precisa de um pacote de licenças para executar o orientador de segmento]

Você pode economizar algum tempo e segmentar apenas os segmentos em que você mais se beneficia.

    
por 17.07.2010 / 13:59
0

Normalmente, é melhor criar uma tabela temporária crie o nome temp_table da tabela como select * from table_you_deleted_from; em seguida, elimine os índices na tabela original disable constraisnt apontando para essa tabela e, em seguida, descarte e recrie essa tabela novamente como criar tabela table_you_deleted_from name como select * from temp_table; recriar seus índices e ativar as restrições.

Aqui, basicamente, você reduziu o tamanho da tabela e o comprimento da árvore do índice, ou seja, o retrocesso mais rápido no futuro.

    
por 18.05.2010 / 17:53