Grande Chiappa, tudo certinho ?

Então...obrigado pelas explicações...realmente é dificil procurando na web, 
reunir desta maneira informações sobre este assunto...

Mas, vamos as dúvidas:

Quando falei de fragmentação, estava me referindo ao HWM alto e principalmente, 
sobre as recomendações do advisor de segmento, onde temos as informações sobre 
os objetos (tabelas e indices), relativo ao espaço alocado e o espaço que 
poderia ser liberado, se ações como SHRINK ou MOVE fossem tomadas (levando em 
consideração que o advisor somente sugere SHRINK).

Normalmente o que faço é verificar as recomendações do advisor, criar alguns 
scripts a partir destas sugestões e executa-las nos finais de semana. Após 
estas execuções sempre obtive uma considerável melhoras nas operações das 
aplicações, principalmente relacionado aos FTS.

Uma outra comprovação seria relativo ao backup / restore que é realizado. No 
meu ambiente de produção trabalho com um RAC (11.1.0.6) e diariamente, gero 
alguns backups logicos (via datapump) para restaura-los no meu ambiente de 
desenvolvimento e HML. Logo após a importação todas as aplicações ficam 
extremamente lentas. Solução ? Realizar a mesma atividade feita em produção, 
gerar os scripts tendo como base o advisor de sgmentos, realizar o MOVE das 
tabelas...tudo volta a funcionar com 100% de velocidade...

Acho que entendi o X da questão...

Um exemplo:

CREATE TABLESPACE XXX DATAFILE '+DATA' SIZE 5M AUTOEXTEND ON NEXT 50K MAXSIZE 
31G

Este comando por exemplo poderia ser o "responsavel" pelo problema no que vc 
escreveu para o 2 topico e o HWM...se todas as tablespaces forem trabalhadas da 
mesma maneira...sem levar em consideração o tamanho das tabelas armazenadas, 
pctfree, used e etc...

Pensando no que vc disse, talvez se utilizasse LMT AUTOALLOCATE ou UNIFORM 
SIZE, teria a mesma quantidade de extends sendo alocados e trabalhando tambem 
na HWM









--- Em oracle_br@yahoogrupos.com.br, José Laurindo <jlchiappa@...> escreveu
>
> Colega, antes de entramos na questão, a pergunta que não quer (e não pode se) 
> calar : vc ** TEM ** uma evidência Exata, Reproduzível e Significativa de 
> performance diferente nos seus SQLs principais após a recriação das tais 
> tabelas , OU vc está se dando ao trabalho só porque viu em algum lugar que 
> isso deve ser feito ????? Pois é um trabalho Gigantesco em bases maiores/mais 
> exigentes, se vc não mede o retorno do investimento, vc  ** Não ** tem como o 
> justificar... Essa evidência não precisa ser nada tão sofisticado quanto um 
> trace, pode ser simplesmente diminuição do número de I/Os, do tempo de CPU ou 
> do tempo gasto na V$SQL para o mesmo SQL, pode um plano diferente antes & 
> depois do rebuild (plano real, capturado/exibido com o 
> dbms_xplan.display_cursor), pode ser uma diferença apreciável pra menos nas 
> v$  de waits e estatísticas da sessão, qquer coisa assim, reproduzível e 
> tecnicamente assertiva...
>  
>  Muito bem : SUPONDO que vc tem a evidência, o primeiro Fato a notar é que 
> há/podem haver  ** DIVERSAS ** issues de I/O ao se acessar tabelas no RDBMS 
> Oracle, e SHRINKs / REBUILDs (além do COALESCE e das  alterações de 
> parâmetros de storage, tipo pctfree/pctused, que vc não cita  mas deveria) 
> atacam ** DIFERENTES ** pontos : vc Necessariamente TEM QUE descobrir qual é 
> o ponto que está causando o problema que vc evidenciou, okdoc ? Chamar tudo 
> de "FRAGMENTAÇÃO" é por demais genérico... Isso serve pra quando vc está 
> passando um conceito de modo superficial (eu mesmo confesso, mais de uma vez 
> numa reunião com analistas tasquei o termo "fragmentação" pra eles poderem 
> entender de modo geral a questão), mas aqui nós estamos entre profissionais 
> de banco de dados, vamos então definir com exatidão o que pode ocorrer E o 
> que vc faz pra cada caso...
>  Vamos lá :
>  
>  1. espaço livre não usado por diferença de tamanho de extents : isso ocorre 
> quando a tablespace possui extents livres de tamanhos totalmente diferentes e 
> não-múltiplos entre si E diferentes do extent requerido na tabela - digamos, 
> a tablespace tem livres vários extents de 19 Kb, de 45 Kb, e de 1,5 Mb, 
> digamos, mas a tabela pede pra alocar extents de 1 Mb : evidentemente não dá 
> pra quebrar/subdividir extents, então o RDBMS ** vai ** formatar e alocar um 
> extent novo quando precisar crescer, DESPREZANDO os que já existem, causando 
> desperdício de espaço e (em caso de Full Table Scan ou similares) causando 
> extents quase sem dados , ou mesmo sem dados, serem lidos... Esta issue é a 
> que normalmente é chamada de fragmentação nas conversas de usuário e em 
> livros genéricos...
>  Solução : usar tablespace LMT, nas tablespaces LMT vc *** Obrigatoriamente 
> ** ou tem extents iguais (se vc optar por indicar o tamanho, com o UNIFORM 
> SIZE) ou tem extents de poucos tamanhos e  MÚLTIPLOS entre si (se optar por 
> AUTOALLOCATE), com tamanhos automaticamente criados e tipo de 16 Kb, 32 Kb, 
> 64 Kb, 1 Mb (aonde os menores  PODEM ser coalescidos pra se criar os 
> maiores), então com isso vc torna IMPOSSÍVEL o problema ocorrer ...
>  
>  2. tamanho de extent muito menor do que o máximo I/O possível no sistema 
> operacional : isso é problema quando vc vai fazer SCANs (Full Table Scan, 
> principalmente)  , caso onde o RDBMS vai ler não blocos, mas extents inteiros 
> : se vc tiver uma tabela de 100 Mb, o máximo de I/O que o SO pode fazer é 1 
> Mb, digamos, MAS os seus extents são todos de 64 Kb, no caso de FTS ao invés 
> do SO fazer 100 I/OS de 1 Mb, ele VAI TER que fazer 1600 (se minhas contas 
> estão corretas :) I/Os de 64 Kb ..... Não é uma issue frequente mas pode 
> ocorrer...
>  Solução : além de usar LMT, ou use LMTs AUTOALLOCATE (nessas tablespaces o 
> RDBMS segue um algoritmo que força o crescimento do extent size cfrme a 
> tabela cresce , até chegar no 1 Mb que é o máximo de I/O típico na maioria 
> dos SOs) , ou se for usar UNIFORM SIZE tenha CERTEZA de como serão usados e 
> até onde vão crescer os objetos que vc botar em tablespaces LMT UNIFORM SIZE, 
> os maiores/com mais tendência a crescer (e portanto a pedir por FTS) ** 
> deveriam ** ser colocados em LMT uniform de 1 Mb, OU múltiplos de 1 Mb ...
>  
>  3. quantidade anormalmente grande de extents : isso era uma preocupação com 
> as tablespaces antigas, as DMT (gerenciadas por dicionário), pois nelas 
> haviam tabelas internas (sys.uet$, sys.fet$, e outras) que continham os 
> extents livres & usados, aí a cada acesso a uma tabela de usuário as tabelas 
> internas tinham que ser acessadas, a cada alteração de dados em tabelas de 
> usuários o novo consumo de extents tinha que ser inserido nas tabelas 
> internas, era bem fácil vc ter problemas de concorrência interna com isso 
> .... as tablespaces LMT usam um bitmap interno pra se controlar, é mais 
> rápido e menos propenso à concorrência... 
>    Solução : usar tablespaces LMT ** E ** se atentar ao item 2. acima :  já 
> que os objetos maiores são mais propensos a FTS, se vc tem um extent size bem 
> ajustado (ou usa AUTOALLOCATE), o extent maior vai naturalmente levar á uma 
> quantidade menor de extents nos objetos grandes , normalmente só isso já 
> deixa a quantidade de extents num nível gerenciável pelos bitmaps...
>    
> 4. high-water mark mais alto do que o necessário : ao se fazer um INSERT /*+ 
> APPEND */ , o APPEND significa que o RDBMS ** não ** vai reaproveitar os 
> extents livres que já estejam reservados pra tabela, e sim vai requisitar 
> novos extents da lista de espaço livre, vai usá-los pra guardar os dados e 
> vai adicionar (APPEND) esses extents ao "final" da tabela... Imagine que vc, 
> após vários DELETEs (vide item 5., abaixo) vc tem a tabela fisicamente em 
> disco tipo abaixo (X são blocos com dados, e os pontos são blocos vazios) :
> 
> XXXXXXXXXXXXX
> XX...........................
> XXXXX...................
> ...............................
> ...............................
> X
> 
> o APPEND necessariamente vai criar novos  extents/blocos, desprezando os que 
> já estão livres, tipo :
> 
> XXXXXXXXXXXXX
> XX...........................
> XXXXX...................
> ...............................
> ...............................
> XXXXXXXXXXXX
> XXXXXXXXXXXX
> XXXXXXXXXXXX
> 
> Isso é problema ?? DEPENDE : se após esse APPEND, vc sabe que no futuro breve 
> vão ser feitos INSERTs normais (vide item 5. abaixo) os espaços livres VÂO 
> SIM ser re-usados, no problema... 
> A Solução , se não vão haver INSERTs normais depois do APPEND , E vc 
> comprovou que esses white-spaces tão interferindo (nos seus FTSs, 
> provavelmente, ou no seu consumo de disco), pode ser :
> 
>   a. pedir um TRUNCATE ao invés de DELETE , antes da carga (APPEND 
> tipicamente são feitos em carga massiva de dados)
>   
>   ou
>   
>   b. liberação física dos extents : isso pode ser feito com SHRINK (** se ** 
> o ROW MOVIMENT está habilitado na tabela, e as demais exigências estão 
> atendidads, checar manual de Concepts no item "Space Reclamation" , OU com o 
> rebuild mesmo .... A diferença desses dois é que, cfrme o manual cita, o 
> SHRINK abaixa o HWM liberando os extents que estão entre o último 
> efetivamente usado e o HWM : os eventuais vazios "no meio" da tabela não 
> necessariamente serão reusados e irão pro free space, a única maneira de vc 
> re-aproveitar esse espaço se vc sabe que não haverão mais INSERTs normais) é 
> mesmo re-alocar os blocos, via REBUILD.... 
>   
>   =====>> ESSA é sua resposta parcial sobre SHRINK x REBUILD, ie, DEPNDE DO 
> QUE VC QUER : se vc quer baixar a HWM ou quer efetivamente reusar os extents 
> no "meio" da tabela, vc TEM QUE analisar aí o seu caso das suas tabelas pra 
> poder entender / descobrir qual o comando que se ajusta melhor ao seu caso...
>   
>     
>   5. white-space / espaço não usado após DELETEs :  esta issue é ao que 
> normalmente a Oracle se refere como "fragmentação" - sim, mesmo a Oracle é 
> culpada de super-simplificar e chamar de fragmentação sem explicar o que é... 
>    Isto tem que ser bem definido, é um dos pontos aonde vc mais besteira vê 
> por aí - o que ocorre é que, após deleções de dados, os blocos/extents que 
> continham dados do objeto que sofreu o DELETE ** vão ** continuar marcados 
> como reservados/pertencentes ao objeto : isso é pra Acelerar os futuros 
> INSERTs, com isso ao invés do RDBMS ter que formatar blocos novos (o que 
> teria que fazer se os blocos que sofreram DELETE fossem liberados pro sistema 
> após o DELETE) , o INSERT reusa simplesmente o espaço que o DELETE liberou... 
>   Isso é CRÍTICO pra entendermos : se a tabela X sofreu DELETEs e algum 
> espaço está disponível pra ela, ** NECESSARIAMENTE ** e Obrigatoriamente os 
> próximos INSERTs vão sim reusar esse espaço disponível, esse espaço ***** NÂO 
> **** está morto, ele VAI SIM ser reusado, okdoc ? A besteira principal que vc 
> vai ouvir é que após DELETEs o espaço não pode ser reusado, fica 'perdido' e 
> isso é um tipo de "fragmentação".... 
>   Muito bem, mas e nos casos aonde o objeto/segmento sofreu DELETEs 
> significativos , e (por regra de negócio) vc SABE que nunca mais serão 
> inseridos novos dados - tipo, é uma tabela particionada que só contém pos 
> dados de Outubro, e o mês de outubro acabou ? Aí sim, esse Sim é um caso onde 
> vc sabe o que o RDBMS Oracle não sabe, vc tem certeza que aquele espaço 
> reservado mas vazio não vai ser nunca reusado pelos novos INSERTs por força 
> de uma regra lógica externa ao banco, aí sim se vc quiser/precisarliberar 
> esse espaço vc TEM que tomar uma ação.... Notar que, além de desperdício de 
> espaço em disco, esse white-space VAI influenciar em FTSs ...
>   Solução : as mesmas do item acima , que (Novamente) só podem;devem ser 
> aplicadas SE e APENAS SE vc realmente sabe que não haverão INSERTs reusando 
> esse espaço em branco...
>   
>   6. white-space/espaço reservado/não usado em Blocos, causando algum tipo de 
> migração de dados : o espaço nos blocos normalmente não é usado do começo ao 
> fim, há algum espaço reservado para futuros UPDATEs : caso esse espaço seja 
> muito grande, na hora dum INSERT de uma linha um tantinho maior não haverá 
> espaço pra gravar no bloco, a linha será "continuada" em um novo bloco, aí 
> eventuais leituras dessa linha passam a exigir mais de um acesso à blocos - 
> multiplique isso por milhões de linhas, E tenha uma Aplicação vagal que faz 
> leitura de muitos dados row by row (via CURSOR, provavelmente) pra processar, 
> e vc terá um grande problema em mãos...
>    Solução : CONHECER a utilização que a tabela terá e especificar 
> PCTFREE/PCTUSEd adequados, ou (em alguns casos, se viável) tentar usar ASSM...
>    
>    
> Em termos gerais é isso , minha Recomendação é lapidar :
> 
>  R1 : obtenha Comprovação de que há diferença Apreciável quando vc faz o 
> REBUILD
>  
>  R2 : antes de pensar em automatizar, descubra Exatamente qual a issue que 
> está "pegando", já que cfrme eu disse em alguns casos há parâmetro/ação que 
> ELIMINA o problema, ao invés de ficar tolamente e cegamente fazendo rebuilds 
> e rebuilds sem pensar
> 
> []s
> 
>   Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, "candiurudba" <candiurudba@> escreveu
> >
> > Bom dia colegas,
> > 
> > Estou pensando em automatizar o processo de desfragmentação de tabelas do 
> > meu RAC.
> > 
> > O volume de transações aumentou consideravelmente e por este motivo, todos 
> > os finais de semana estou tendo que executar manualmente procedimentos para 
> > desfragmentar as tabelas, o que tem tomado muito do meu tempo.
> > 
> > Alguêm teria alguma forma de uma verificação mais simples destas 
> > fragmentação para que eu possa gerar um script agendado no CRON ?
> > 
> > Uma outra dúvida é quanto os procedimentos para reorganização das tabelas 
> > fragmentadas. Sempre utilizei o comando MOVE com o rebuild dos indices e 
> > todos sabemos que ele (muitas vezes) é extremamente consumidor (CPU), 
> > gerando problemas tambem nos indices, sendo necessário o rebuild dos mesmos.
> > 
> > Andei lendo alguma coisa sobre SHRINK SPACE COMPACT para reorganização das 
> > linhas nas tabelas, eliminando a fragmentação existente e depois SHRINK 
> > SPACE para mexer na HWM. Teoricamente estes comandos em conjunto, deixam as 
> > tabelas em funcionamento para operação DML, não consomem tanto recursos de 
> > maquina, alem de não deixarem os indices como UNUSABLE. Seria isto mesmo ?
> >
>


Reply via email to