Guob 2014
Segment Advisor Script v1.0
dezembro 12, 2012

Só nós DBA’s sabemos as inúmeras funções, sintaxes e comandos que precisamos decorar no nosso dia a dia e isso não é uma tarefa fácil, além do que, as soluções sempre precisam ser rapidamente propostas. Por isso que gosto de facilitar as coisas sempre que posso, assim como esse script, que além de simples ele realiza é uma formarápida os passos que nem sempre são lembrados, isso evita aquele tempão gasto procurando na documentação a sintaxe exata de tal procedimento. Qual DBA que nunca passou por isso que atire a primeira pedra!

O objetivo principal do script é facilitar a execução do Oracle Segment Advisor, de uma forma bem simples, apenas três argumentos e nada mais e o melhor de tudo: não é preciso criar qualquer tipo de objeto no banco de dados, todo trabalho é executado através de um bloco anônimo de PLSQL e o único requisito aqui é o bom e velho SQL*Plus.

Você pode conferir a primeira versão (sim, próximas poderão surgir) você pode fazer aqui.

Como usar Segment Advisor Script?

SYNTAX: { @run_sa “Owner Segment” “Segment Name” “Segment Type” }

Ele não precisa nada mais além do que três argumento:

1. “Owner Segment” :  O primeiro representa o nome do owner do segmento.

2. “Segment Name”:  O segundo representa o nome do segmento.

3. “Segment Type”:  O terceiro representa o tipo do segmento. Que pode ser um TABLE, INDEX etc …

Usando o Segment Advisor Script

Para explicar melhor vamos a um teste prático.

Primeiro de tudo, precisamos de uma tabela grande favorável para o teste que vamos fazer, para isso criei a tabela chamada TBIG dentro do schema FSOARES.

FSOARES@dbtst> create table tbig as select * from dba_source;

Table created.

FSOARES@dbtst> insert into tbig (select * from tbig);

633054 rows created.

FSOARES@dbtst> /

1266108 rows created.

FSOARES@dbtst> /

2532216 rows created.
...
FSOARES@dbtst> commit;
FSOARES@dbtst> @size tbig

SEGMENT_NAME                    SEGMENT_TYPE        SIZE_MB
------------------------------ ------------------ ---------------
TBIG                             TABLE              5,244.00

Pronto, temos agora uma tabela de 5G que está perfeita para o nosso teste. Vamos ver quantos registros temos:

FSOARES@dbtst> set timing on
FSOARES@dbtst> select count(*) from tbig;

COUNT(*)
----------
40515456

1 row selected.
Elapsed: 00:04:08.21

Ok, temos cerca de 40515456 registros e levamos cerca de 4 minutos para sabermos isso. Vamos agora apagar uns 98% dessa tabela deixando apenas alguns milhares de registro. Para fazer essa operação mais racional,  quero descobrir  quantos registros tenho por usuário nessa tabela, afim de deixar apenas os menores owners:

FSOARES@dbtst> select count(*), owner from tbig group by owner order by 1;

  COUNT(*) OWNER
---------- ------------------------------
       576 IX
       576 OUTLN
      1088 PM
      2176 FLOWS_FILES
      2176 HR
      2880 SYSTEM
     13696 OE
     14912 ORDPLUGINS
     19392 WMSYS
     70464 EXFSYS
    183808 ORACLE_OCM
    230528 DBSNMP
    231552 ORDSYS
    548288 XDB
    731264 OLAPSYS
   1258816 CTXSYS
   1340416 MDSYS
   2624256 APEX_030200
   9466112 SYS
  23772480 SYSMAN

20 rows selected.

Elapsed: 00:01:14.06
FSOARES@dbtst> delete tbig where owner NOT IN ('IX', 'OUTLN');                         
40514304 rows deleted.

Elapsed: 00:29:57.41
FSOARES@dbtst> commit;

Commit complete.

Elapsed: 00:00:00.01

Aqui, a nossa tabela TBIG está somente com os dados usuário IX e OUTLN, o resto dos outros usuário foi simplesmente apagado. Bom como temos agora apenas alguns registros vamos realizar aquele mesmo count para ver o a quantidade de registro, vamos ver agora o quanto tempo levará. Primeiro é claro, vamos remover a consulta do nosso cache.

FSOARES@dbtst> alter system flush shared_pool;

System altered.

FSOARES@dbtst> alter system flush buffer_cache;

System altered.

FSOARES@dbtst> select count(*) tbig

  COUNT(*)
----------
      1152

1 row selected.

Elapsed: 00:03:53.93

Temos agora cerca de mil registros e levamos quase o mesmo tempo para realizar o count da tabela quando ela estava com mais de 40 milhões de registro!? Como isso pode ser? Tivemos o mesmo tempo para contar de 0 a 1152 e de 0 a 40 milhões?

Bom, sem dúvidas há alguma coisa de errado com nosso segmento de tabela TBIG. É aí que entra o Segment Advisor, que vai nos aconselhar o que fazer com esse segmento.

Veja como é simples:

FSOARES@dbtst> @run_sa fsoares tbig table

---------------------------------------------------------------------------------
-- Segment Adviser Script v1.0 by Flavio Soares ( http://flaviosoares.com )

Running the Segment Advisor for Segment 
Owner   : FSOARES
Segment Name: TBIG
Segment Type: TABLE

Segment Advisor successfuly completed

For delete the task TaskName_FSOARES_cxdnLahXMf run: 
SQL> exec  dbms_advisor.delete_task('TaskName_FSOARES_cxdnLahXMf');

-- Showing the Segment Advice Recommendations for the object "table" "fsoares" "tbig"

 TABLESPACE_NAME   : USERS
 SEGMENT_OWNER     : FSOARES
 SEGMENT_NAME      : TBIG
 SEGMENT_TYPE      : TABLE
 PARTITION_NAME    :
 ALLOC_MB          :    5,244.00
 RECLAIM_MB        :    4,567.54
 USED_MB           :      676.46
 PCT_SAVE          : 87 %
 RECOMMENDATIONS   : Enable row movement of the table FSOARES.TBIG and perform shrink, estimated savings is 4789413285 bytes.
 SOLUTION 1        : alter table "FSOARES"."TBIG" shrink space
 SOLUTION 2        : alter table "FSOARES"."TBIG" shrink space COMPACT
 SOLUTION 3        : alter table "FSOARES"."TBIG" enable row movement

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

Observe a recomendação, ele sugere realizar um shrink na tabela que ganharemos com isso cerca de 87% de espaço que hoje não está sendo utilizado. Opa!  … é 87% é um bom ganho, então vamos aplicar as recomendações sugeridas.

FSOARES@dbtst> alter table "FSOARES"."TBIG" enable row movement;

Table altered.

FSOARES@dbtst> alter table "FSOARES"."TBIG" shrink space;

Table altered.

Após as recomendações aplicadas, vamos agora executar novamente o count de encontro a tabela TBIG e observar o tempo:

FSOARES@dbtst> alter system flush shared_pool;

System altered.

FSOARES@dbtst> alter system flush buffer_cache;

System altered.

FSOARES@dbtst> select count(*) from tbig;

  COUNT(*)
----------
      1152

1 row selected.

Elapsed: 00:00:00.01

Depois da recomendação aplicada, o tempo simplesmente caiu para 0.01 segundos.

Viu como ficou bem mais simples utilizar o Segment Advisor agora com o run_sa.sql :)

Com apenas três argumentos e já temos nossas recomendações.

FSOARES@dbtst> @run_sa fsoares tbig table

---------------------------------------------------------------------------------
-- Segment Adviser Script v1.0 by Flavio Soares ( http://flaviosoares.com )

Running the Segment Advisor for Segment 
Owner   : FSOARES
Segment Name: TBIG
Segment Type: TABLE

Segment Advisor successfuly completed

For delete the task TaskName_FSOARES_cxdnLahXMf run: 
SQL> exec  dbms_advisor.delete_task('TaskName_FSOARES_cxdnLahXMf');

-- Showing the Segment Advice Recommendations for the object "table" "fsoares" "tbig"

 TABLESPACE_NAME   : USERS
 SEGMENT_OWNER     : FSOARES
 SEGMENT_NAME      : TBIG
 SEGMENT_TYPE      : TABLE
 PARTITION_NAME    :
 ALLOC_MB          :    5,244.00
 RECLAIM_MB        :    4,567.54
 USED_MB           :      676.46
 PCT_SAVE          : 87 %
 RECOMMENDATIONS   : Enable row movement of the table FSOARES.TBIG and perform shrink, estimated savings is 4789413285 bytes.
 SOLUTION 1        : alter table "FSOARES"."TBIG" shrink space
 SOLUTION 2        : alter table "FSOARES"."TBIG" shrink space COMPACT
 SOLUTION 3        : alter table "FSOARES"."TBIG" enable row movement

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

Dúvidas, melhorias, bugs, recomendações serão muito bem vindas!

Um abraço e aproveitem!

GUOB 1ª Encontro 2012
março 25, 2012

Ontem ocorreu o Primeiro encontro de 2012 do Grupo de Usuários de Tecnologia Oracle do Brasil o GUOB, realizado aqui em São Paulo.

Apesar de ter chegado quase no final do evento, consegui ver a tempo o palestrante Craig A. Shallahamer que despensa comentários. Além da extrema simpatia é um grande conhecedor Oracle, principalmente em performance.

“Craig é um pesquisador, escritor e professor de milhares de profissionais Oracle. Seu foco é Oracle performance management, o que levou a publicar mais de 24 trabalhos técnicos e autoria do livros Oracle Performance Firefighting and Forecasting Oracle Performance, e colaborador regular do seu blog  A Wider View. Craig é o criador e professor do popular  Advanced Oracle Performance Analysis, Oracle Performance Firefightin e Oracle Forecasting, além  de cursos de Predictive Analysis. Depois de nove trabalhando na Oracle Corporation, em que ele co-fundou as principais tecnologias e dos Grupos de desempenho do sistema em 1998, ele deixou a Oracle para iniciar OraPub, Inc. Ele é um educador apaixonado e um instrutor envolvente. Seu estilo de apresentação divertida combina com a sua profundidade de experiências Oracle para fazer com que cada apresentação única. Um Oracle ACE Director, ele ensinou milhares de profissionais Oracle em 6 continentes em 24 países.”  http://www.guob.com.br/

Essa foi a minha primeira participação no GUOB e gostei muito, principalmente por sentir que o evento é muito mais voltado a área técnica. A própria palestra do mito Craig falou sobre o Oracle Buffer Cache Internals, que mostrou os conceitos de como o Oracle realiza o gerenciamento de dados dentro do Buffer Cache.

Consegui até uma foto com o Craig :)