Recuperando espaço lógico de um espaço de tabela

11

Eu tenho um espaço de tabela chamado DATA e é configurado com a extensão automática como falsa. Esse espaço de tabela possui dois arquivos de dados e é configurado para ocupar 350 GB de espaço físico.

Há uma semana, consultei user_tablespaces e dba_data_files e notei que havia 20% do espaço lógico disponível. Em seguida, procedo com uma limpeza e removi muitos registros das tabelas neste espaço de tabela. Esperávamos ver um grande aumento no espaço disponível. Infelizmente, ao consultar as visualizações, notei que o espaço disponível era de 20,5%.

Isso pode ser devido à fragmentação dos dados? Podemos "desfragmentar" o espaço de tabela de alguma forma e recuperar o espaço perdido? Ou precisamos recriar o espaço de tabela a partir do zero?

Nuno Furtado
fonte

Respostas:

14

Quando você exclui registros, não há nada que compacte automaticamente o segmento; portanto, você precisará diminuir o segmento para recuperar o espaço. Aqui está um trecho do Guia do Administrador 11.2 sobre Recuperação de espaço desperdiçado :

Com o tempo, as atualizações e exclusões de objetos em um espaço de tabela podem criar bolsões de espaço vazio que individualmente não são grandes o suficiente para serem reutilizados para novos dados. Esse tipo de espaço vazio é chamado de espaço livre fragmentado.

Objetos com espaço livre fragmentado podem resultar em muito espaço desperdiçado e afetar o desempenho do banco de dados. A maneira preferida de desfragmentar e recuperar esse espaço é executar um encolhimento de segmento online. Esse processo consolida o espaço livre fragmentado abaixo da marca d'água máxima e compacta o segmento. Após a compactação, a marca d'água alta é movida, resultando em novo espaço livre acima da marca d'água alta. Esse espaço acima da marca d'água alta é então desalocado. O segmento permanece disponível para consultas e DML durante a maior parte da operação e não é necessário alocar espaço em disco extra.

Mais abaixo na mesma página, você pode ler isto:

A redução de segmento é uma operação on-line no local. As operações e consultas DML podem ser emitidas durante a fase de movimentação de dados do encolhimento do segmento. As operações simultâneas de DML são bloqueadas por um curto período de tempo no final da operação de redução, quando o espaço é desalocado. Os índices são mantidos durante a operação de redução e permanecem utilizáveis ​​após a conclusão da operação. A redução de segmento não requer espaço extra em disco para ser alocado.

A redução do segmento recupera o espaço não utilizado acima e abaixo da marca d'água alta. Por outro lado, a desalocação de espaço recupera o espaço não utilizado apenas acima da marca d'água alta. Nas operações de redução, por padrão, o banco de dados compacta o segmento, ajusta a marca d'água alta e libera o espaço recuperado.

A página inclui muito mais informações sobre o assunto, incluindo exemplos.

A seção "Espaço do segmento e a marca d'água alta" do Guia de conceitos também pode ser útil.

Leigh Riffel
fonte
9

Sim, será devido à fragmentação.

Para recuperar o espaço, primeiro obtenha uma lista de tabelas no espaço de tabela com a seguinte consulta (ignorando partições - edite sua pergunta se você as estiver usando):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Em seguida, para cada tabela, ative o movimento da linha:

alter table TABLEINDATAPARTITION enable row movement;

Você pode encolher a tabela:

alter table TABLEINDATAPARTITION shrink space;

Depois, reduza os arquivos de dados com:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Os nomes dos arquivos de dados podem ser obtidos na DBA_DATA_FILESvisualização, da qual você já está ciente.

Philᵀᴹ
fonte
Excelente, uma resposta prática. +1
Leigh Riffel