Pular para o conteúdo

Fóruns Banco de dados Oracle Fragmentação de tablespaces Fragmentação de tablespaces

#90511
David Siqueira
Participante

    Olá rapaziada!!!

    Bem em caso de fragmentação ha alguns scripts que podem ser rodados e com isso detectar se ha um alto indice de fragmentação em suas tablespaces ( tabelas e indices), um outro indicativo são os usuários finais, pois se alguem reclama sobre determinado processo que era rápido e tão logo ficou lento há uma grande chance de ser fragemntação, pois caso tenha ocorrido uma limpeza de dados , a tabela muito facilmente se encontrara com bloco livres não-aglutinados, obrigando o Oracle a ler uma fileira de blocos e mais blocos até encontar o dado que procura.

    Sugiro que usem as ferramentas Oracle para identificar sinais de possiveis contenções , é uma analise detalhada e minuciosa, visto que terão que coletar informações, usem para isso STATSPACK , AWR etc.

    segue alguns scripts que ja usei :

    --------------

    Script 1

    set lin 150
    comp sum of nfrags totsize freesize on report
    break on report

    set numformat 999,999,990

    col sname justify l for a15
    col tbs for a15
    col nfrags heading 'Free|Frags'
    col maxfrag justify c heading 'Largest|Frag (Kb)'
    col maxnext justify c heading 'Largest|Next Extent (Kb)'
    col totsize heading 'Total|(Kb)'
    col freesize heading 'Available|(Kb)'
    col pctused heading 'Pct|Used'

    col name noprint new_value dbname
    select name from v$database;

    create or replace view aps_data_files as
    select tablespace_name,
    sum(bytes) bytes
    from dba_data_files
    group by tablespace_name;

    spool d:Pro-atividadefreespace_frag.log

    ttitle left "Database:"dbname" - Tablespace Fragmentation Report" skip 2

    select t.tablespace_name tbs,
    count(f.bytes) nfrags,
    nvl(max(f.bytes)/1024,0) maxfrag,
    t.bytes/1024 totsize,
    nvl(sum(f.bytes)/1024,0) freesize,
    (1-nvl(sum(f.bytes),0)/t.bytes)*100 pctused
    from aps_data_files t,
    dba_free_space f
    where t.tablespace_name = f.tablespace_name(+)
    group by t.tablespace_name,t.bytes;

    select fs.tablespace_name tbs,
    max(s.next_extent)/1024 maxnext,
    max(fs.bytes)/1024 maxfrag,
    max(segment_name) sname
    from dba_free_space fs,
    dba_segments s
    where fs.tablespace_name=s.tablespace_name
    group by fs.tablespace_name
    having max(s.next_extent) > max(fs.bytes);

    ttitle off
    spool off


    Script 2

    COL C1 FORMAT A20
    COL C2 FORMAT 999,999,999,999
    COL SEGMENT_NAME FOR A25
    BREACK ON OWNER ON TABLESPACE_NAME
    SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME||
    decode(SEGMENT_TYPE,'TABLE','[T]', 'INDEX', '[I]',
    'ROLLBACK','[R]', '[O]') segment_name
    , sum(BYTES) C2,
    decode(count(),1,to_char(count()),
    2,to_char(count()),
    3,to_char(count(
    )),
    4,to_char(count()),
    5,to_char(count(
    )),
    to_char(count(*))||' 5;

    Espero que os ajudem, caso queiram podem dar uma olhadinha no BLOG também :

    http://databaseguard.blogspot.com/2009/09/reorganizando-meu-banco-de-dados.html

    Abraço á todos!!!