Reclaiming Unused Space – Recuperando Espaço Não Utilizado no Banco de Dados Oracle
Imagine que seu banco de dados Oracle é como um aeroporto. Cada tabela e índice são como terminais e portões, enquanto os segmentos são os voos e passageiros ocupando espaço nas pistas e nos portões. Com o tempo, o aeroporto pode ficar congestionado com voos cancelados, atrasos e bagagens não reclamadas. Vamos ver como podemos “limpar o aeroporto” e otimizar o espaço.
Verificar Terminais e Portões Congestionados
Primeiro, precisamos identificar os terminais (tabelas) e portões (índices) que estão fragmentados ou congestionados. Pense nas tabelas e índices como áreas do aeroporto com muitas áreas vazias ou espaço desperdiçado.
Execute os seguintes comandos para verificar o espaço utilizado e vazio:
TABELAS
SELECT table_name, ROUND((blocks * 8)/1024, 2) AS size_MB,
ROUND((empty_blocks * 8)/1024, 2) AS empty_space_MB
FROM dba_tables
WHERE owner = 'HR';
Para índices, use:
ÍNDICE
SELECT i.index_name, i.table_name, ROUND((s.bytes / 1024 / 1024), 2) AS size_MB
FROM dba_segments s
JOIN dba_indexes i ON s.segment_name = i.index_name
WHERE s.segment_type = 'INDEX' AND s.owner = 'HR';a'
Após essa verificação, podemos ver todas as tabelas e índices vinculados ao usuário HR. Como se trata de um laboratório de teste com pouca movimentação, conseguimos expor todas as tabelas e índices facilmente. Mas, mesmo em um banco pequeno, é importante não subestimar a importância desse exercício.
Movendo Segmentos
Depois de verificar o status das tabelas e índices, podemos mover os segmentos com o comando:
MOVENDO TABELAS – RECONSTRUINDO ÍNDICES
ALTER TABLE hr.employees MOVE ONLINE;a
E, em seguida, reconstruir os índices:
BEGIN
FOR r IN (SELECT index_name FROM dba_indexes WHERE table_name = 'EMPLOYEES' AND owner = 'HR') LOOP
EXECUTE IMMEDIATE 'ALTER INDEX hr.' || r.index_name || ' REBUILD ONLINE';
END LOOP;
END;
/
Movemos a tabela employees, realocando-a e liberando espaço ao desfragmentar o espaço vago em disco. E sem perder tempo, reorganizamos os índices. Essa ação é crucial, pois a realocação da tabela pode fazer com que os índices percam suas referências, então reconstruí-los após a movimentação é essencial.
Verificando o Tamanho Após a Movimentação
Para verificar o tamanho da tabela employees após a movimentação, execute:
REVENDO O TAMANHO
SELECT segment_name, segment_type, ROUND((bytes / 1024 / 1024), 2) AS size_MB
FROM dba_segments
WHERE segment_name = 'EMPLOYEES' AND owner = 'HR';
Conclusão
O comando ALTER TABLE … MOVE ONLINE é útil para reorganizar a tabela e liberar espaço sem causar grandes interrupções. A reconstrução dos índices é uma etapa crucial após a movimentação para garantir que os índices estejam atualizados e utilizáveis.
Seguindo esses passos, você mantém seu “aeroporto” funcionando de maneira eficiente, garantindo que todos os “voos” e “passageiros” estejam bem acomodados.