[oracle_br] Re: Liberação automatico de espaço após delete em tabelas com CLOB.
Na medida do possível eu recomendaria que vc tentasse levantar com eles exatamente o que eles fazem, e quando/como fazem, de forma que CASO o efeito em questão seja algo decorrente de funcionalidade básica do Oracle (ie, de não liberar o espaço após um DELETE) E CASO não tenha como eles remodelarem isso, que AO MENOS vc possa se programar com o work-around Por exemplo : um modelo Absurdo, mas que já vi implementado numa Aplicação (que gerenciava Documentos, tipo Apólices de Seguro) era que, AO INVÉS da data de criação ser um atributo da tabela TAB_DOCTOS que continha a coluna LOB com o documento, a doida de pedra da aplicação criava uma tabela para cada Semana. cada uma com a coluna LON necessária e os demais atributos, assim tínhamos uma tabela TAB_DOCTOS_JAN_S1, uma TAB_DOCTOS_JAN_S2 com as MESMAS colunas, TAB_DOCTOS_JAN_S3 com as MESMAS colunas, vc entendeu... Além dos Óbvios problemas de performance (tais como crescimento do dicionário de dados, exigência TOTAL de SQL Dinãmico pois contrariando toda e qquer norma de RDBMS não se sabe em qual tabela um dado está, JOINs imensos com uma dúzia ou mais de tabelas referenciadas no tal SQL dinãmico, etc, etc) , para Adicionar o modelo previa que quando um Documento deixasse de ser válido o registro fosse DELETADO da tabela onde ele estava, e quando fosse necessário inserir novamente quase com certeza já se passou uma semana, então ele vai ser re-inserido noutra tabela... É o caso TÍPICO : a informação foi deletada, o RDBMS Oracle ** reservou ** o espaço do DELETE para futuros INSERTs/UPDATEs, mas há uma regra de negócio, uma condição lógica estabelecida FORA DO DATABASE que indica que NÃO haverá INSERTs ou UPDATEs : taí, tal espaço reservado é puro desperdício, causado por uma Modelagem questionável que não faz o que comumente é feito... []s Chiappa
[oracle_br] Re: Liberação automatico de espaço após delete em tabelas com CLOB.
Vlw Chiappa pela ajuda. o Problema era a aplicação, não sei o q os caras fizeram. Fiz um delete manual pelo banco e depois disso foi feito um coalesce da na tablespace e o Oracle agora esta reaproveitando os espaços.
[oracle_br] Re: Liberação automatico de espaço após delete em tabelas com CLOB.
Régis, até onde sei o RDBMS Oracle (principalmente por causa do grande overhead ao se reformatar para uso espaço fora do database) *** não *** libera para disco o espaço após DELETEs automaticamente, SEJA em data segments, index segments ou LOB SEGMENTs, na Suposição de que as tabelas/índices/etc que sofreram o DELETE em breve vão sofrer novos DMLs, aí esse espaço que ficou reservado após o DELETE é Automaticamente reusado e ganha-se um enorme boost em performance, ao evitar que o RDBMS tenha que formatar novos blocos pra isso... Então, se vc REALMENTE estiver num cenário não-rotineiro, onde vc tem quase absoluta certeza de os objetos que sofreram DELETE ** não ** vão sofrer DMLs proximamente E vc tá numa secura de espaço em disco que exija que esse espaço reservado ** TEM ** que ser liberado para uso alhures em outros segmentos, afaik Não Há como se fazer isso automaticamente, vc TEM que agendar (via job, trigger, o que for) uma rotina de liberação, seja via SHRINK/COALESCE, seja via COMPACT, ALTER xxx DEALLOCATE, movimentação de dados (via DBMS_REDEFINE ou recriação de objeto) com posterior TRUNCATE, é por aí... A indicação DEPENDE 100% de quanto está sendo não-usado no momento e onde está esse espaço (se acima ou abaixo da HWM, etc)... Apenas como complemento, questiono : vc *** ANALISOU *** esse data segment, os eventuais índices e o LOB aí ? Vc diz que a tabela cresceu 10 GB em dois dias, tá, mas QUANTO desses 10 GB eram mesmo dados ??? Nada impede que desse crescimento sei lá, 1 GB sejam de dados efetivos e o resto seja de espaço reservado, ou de temporary lobs (http://www.toadworld.com/platforms/oracle/w/wiki/2050.datatypes-temporary-lobs.aspx), ou de espaço acima da HWM, etc : em qquer caso, se for uma proporção assim tão gritante, com certeza (** sempre ** com a Ajuda/Suporte/Autorização do teu Fornecedor) vc pode considerar mudar a cláusula de STORAGE dos seus LOBs, o CHUNK SIZE, etc... Vc também (SEMPRE e AINDA com a Ajuda/Suporte/Autorização do seu Fornecedor) deveria considerar a possibilidade se SECUREFILES (tipicamente mais eficientes na utilização de espaço em disco, além das questões de performance) ** E ** deveria confirmar que não nenhum LEAKING, ie, que os LOBs após terem sidos abertos pela Aplicação são Fechados : cfrme https://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:2957424542334#4530439400346713089 , uma Aplicação responsável Abre, usa e Fecha os LOBs, e naturalmente após o fechamento as estruturas de trabalho criadas para o LOB são liberadas ... Caso a aplicação não faça isso, é um BUG, é um LEAK de recurso que vc está enfrentando, isso TEM que ser corrigido na Aplicação : é similar á memória que vc alocou mas não desalocou no final do uso, aos arquivos em disco que a aplicação abriu/criou file handles mas não fechou, etc... []s Chiappa
[oracle_br] Re: Liberação automatico de espaço após delete em tabelas com CLOB.
Régis, até onde sei o RDBMS Oracle (principalmente por causa do grande overhead ao se reformatar para uso espaço fora do database) *** não *** libera para disco o espaço após DELETEs automaticamente, SEJA em data segments, index segments ou LOB SEGMENTs, na Suposição de que as tabelas/índices/etc que sofreram o DELETE em breve vão sofrer novos DMLs, aí esse espaço que ficou reservado após o DELETE é Automaticamente reusado e ganha-se um enorme boost em performance, ao evitar que o RDBMS tenha que formatar novos blocos pra isso... Então, se vc REALMENTE estiver num cenário não-rotineiro, onde vc tem quase absoluta certeza de os objetos que sofreram DELETE ** não ** vão sofrer DMLs proximamente E vc tá numa secura de espaço em disco que exija que esse espaço reservado ** TEM ** que ser liberado para uso alhures em outros segmentos, afaik Não Há como se fazer isso automaticamente, vc TEM que agendar (via job, trigger, o que for) uma rotina de liberação, seja via SHRINK/COALESCE, seja via COMPACT, ALTER xxx DEALLOCATE, movimentação de dados (via DBMS_REDEFINE ou recriação de objeto) com posterior TRUNCATE, é por aí... A indicação DEPENDE 100% de quanto está sendo não-usado no momento e onde está esse espaço (se acima ou abaixo da HWM, etc)... Apenas como complemento, questiono : vc *** ANALISOU *** esse data segment, os eventuais índices e o LOB aí ? Vc diz que a tabela cresceu 10 GB em dois dias, tá, mas QUANTO desses 10 GB eram mesmo dados ??? Nada impede que desse crescimento sei lá, 1 GB sejam de dados efetivos e o resto seja de espaço reservado, ou de temporary lobs (http://www.toadworld.com/platforms/oracle/w/wiki/2050.datatypes-temporary-lobs.aspx), ou de espaço acima da HWM, etc : em qquer caso, se for uma proporção assim tão gritante, com certeza (** sempre ** com a Ajuda/Suporte/Autorização do teu Fornecedor) vc pode considerar mudar a cláusula de STORAGE dos seus LOBs, o CHUNK SIZE, etc... Vc também (SEMPRE e AINDA com a Ajuda/Suporte/Autorização do seu Fornecedor) deveria considerar a possibilidade se SECUREFILES (tipicamente mais eficientes na utilização de espaço em disco, além das questões de performance) ** E ** deveria confirmar que não nenhum LEAKING, ie, que os LOBs após terem sidos abertos pela Aplicação são Fechados : cfrme https://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:2957424542334#4530439400346713089 , uma Aplicação responsável Abre, usa e Fecha os LOBs, e naturalmente após o fechamento as estruturas de trabalho criadas para o LOB são liberadas ... Caso a aplicação não faça isso, é um BUG, é um LEAK de recurso que vc está enfrentando, isso TEM que ser corrigido na Aplicação : é similar á memória que vc alocou mas não desalocou no final do uso, aos arquivos em disco que a aplicação abriu/criou file handles mas não fechou, etc... []s Chiappa