No Oracle versão 11g:
Depois de pesquisar no Google, não consigo encontrar uma maneira simples de recuperar espaço livre após excluir uma tabela.
Encontrei muitas explicações, dizendo como o arquivo de dados fica fragmentado, a grande pilha de consultas chatas que você precisa executar para mover o "espaço vazio" no final do arquivo de dados (tabela por tabela ... mesmo quando você tem 200 mesas!?).
Então você tem que reduzir o tamanho do arquivo de dados "adivinhando" em quanto você pode reduzi-lo, ou você deve saber exatamente qual é o seu "tamanho de bloco"... E finalmente você não deve esquecer de "reconstruir os índices".
Veja por exemplo: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:54178027703899
e http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
Existe um procedimento PL/SQL simples que, dado um nome de tablespace ou nome de arquivo de dados, seria para esse trabalho? Ou alguma ferramenta semelhante da Oracle?
A resposta curta é Não . Infelizmente, a maneira de fazer isso no Oracle requer a "grande pilha de consultas chatas". Os artigos aos quais você vinculou são algumas das melhores informações disponíveis sobre o assunto. O arquivo de dados realmente se torna fragmentado, de modo que, mesmo que exista espaço livre abaixo do segmento mais alto, o Oracle não o consolidará automaticamente quando a
RESIZE
for concluído.Para "desfragmentar" o tablespace, você precisa mover esses segmentos para o início do arquivo de dados e não para o final. Para mesas, este é um processo offline, o que significa que a mesa não estará disponível enquanto a movimentação estiver ocorrendo. Os índices podem ser movidos offline ou com Enterprise Edition eles podem ser movidos online. Como você tem uma janela de interrupção, recomendo que você siga estas etapas.
A. Reduza os arquivos de dados com espaço livre além do limite máximo. Isso pode ser feito da seguinte forma (a consulta é semelhante ao procedimento do Frosty Z):
B. Depois de reduzir as coisas acima da marca d'água, descubra quais tablespaces ainda se beneficiariam com a movimentação de segmentos.
C. Para cada um desses tablespaces, determine quais segmentos precisam ser movidos. (Substitua USERS pelo nome do seu tablespace ou una-o com a consulta anterior)
D. Mova cada tabela e reconstrua os índices e estatísticas.
E. Repita a etapa A.
Acabei de construir a maioria dessas consultas, então você vai querer testá-las completamente antes de usar. Suponho que você poderia criar um procedimento que usaria
EXECUTE IMMEDIATE
para criar as instruções reais para executar dinamicamente, mas como as consultas receberão ORA-08103: O objeto não existe mais enquanto a movimentação está em andamento, acho melhor controlar esse processo manualmente mesmo se isso significar um pouco mais de tempo/esforço.Solução parcial inspirada nesta página :
Ele não reorganiza o espaço livre, mas detecta automaticamente o espaço livre disponível no final dos arquivos de dados e imprime os comandos 'RESIZE' apropriados.
Antes de tentar reduzir os arquivos de dados, pergunte a si mesmo: você vai criar novos segmentos novamente dentro do espaço de tabela associado em algum momento em um futuro não tão distante? Se sim, não adianta diminuir. O espaço será reutilizado para seus novos segmentos e você economiza muito esforço para si mesmo e para o sistema, deixando-o como está.
Depois de navegar no google por dias, encontrei o exemplo mais simples e claro para recuperar o espaço livre no tablespace após a exclusão. Eu espero que isso ajude
Link: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
solução:
Vamos criar uma tabela com 9999 linhas, cada uma com cerca de 1k:
A tabela tem 29 extensões alocadas a ela, para um total de 14,6M:
Vamos deletar TODAS as linhas:
Agora- "surpresa" - a tabela ainda usa as mesmas extensões:
Por quê ? Porque mesmo que você exclua todas as linhas da tabela, o High Water Mark não é diminuído - ele nunca é diminuído, para permitir a simultaneidade máxima (Oracle leva a sério a maximização da simultaneidade, ou seja, desempenho e escalabilidade; é a principal razão por trás de seu sucesso em aplicativos corporativos).
Desalocar o espaço não utilizado (= espaço acima do HWM) não ajuda muito (já que não há muito espaço não utilizado acima do HWM):
Agora, vamos MOVER a tabela, que em essência significa clonar a tabela (incluindo gatilhos, restrições e assim por diante), transferir as linhas, descartar a tabela "antiga" e renomear a nova - tudo feito pelo kernel, tão super seguro mesmo em caso de falha da máquina/servidor:
Agora, temos agora apenas a extensão inicial alocada:
Advertência: normalmente acontece que muitos/todos os índices na tabela ficam INUSÁVEIS após a mudança (não neste caso, mas estou executando a versão 9.2.0.4, a versão mais recente, que provavelmente otimizou o processo no caso de tabelas totalmente vazias ):
Se STATUS não fosse VALID, você poderia simplesmente reconstruir manualmente o(s) índice(s):
Ou você pode automatizar todo o processo:
Como exemplo, vamos definir manualmente o índice para UNUSABLE:
HTH Alberto
Como dito anteriormente, você terá que mover todas as mais de 200 tabelas nesse tablespace para liberar algum espaço em seu arquivo de dados e, em seguida, redimensionar para recuperar o espaço. Mas em vez de executar todas essas consultas, o 12c Enterprise Manager faz essa tarefa. Você terá que navegar para Database Home > Storage > Tablespace. Selecione o tablespace no qual deseja trabalhar e clique em Reorganizar. Ele dará uma opção para visualizar as instruções SQL que estão prestes a ser executadas. Você pode fazer uma cópia deles e executá-lo você mesmo ou agendar um trabalho no EM.
Na verdade, ele cria outro tablespace, move todos os objetos para o novo tablespace, reconstrói os índices e remove os objetos do tablespace antigo.
Há um par de desvantagens que posso pensar. Isso deve ser feito fora do horário de pico, caso contrário, ocorrerá um erro dizendo que o recurso está ocupado. O arquivo de dados (não o tablespace) terá "reorg" adicionado ao seu nome, no final.