segunda-feira, 7 de fevereiro de 2011

Como determinar o tamanho da “tablespace” de UNDO no gerenciamento automático

Este artigo auxiliará DBA´s no redimensionamento da “tablespace” de UNDO no gerenciamento automático.

Esta solução poderá ser aplicada nas versões desde 9.2.x até 11.2.x do Oracle Enterprise Edition em qualquer plataforma operacional.

Para determinar o tamanho da “tablespace” de “UNDO” devemos obter três informações.

• (UR) – O valor de UNDO_RETENTION em segundos;
• (UPS) – Número de blocos de “UNDO” que são gerados por segundos;
• (DBS) – Sobrecarga “overhead” nas quantidades de extensões dos segmentos de “UNDO”
versus o tamanho do bloco no banco de dados (parâmetro: db_block_size).

Uma vez obtidas as informações acima iremos substituí-las na equação abaixo:

Tamanho da área de Undo = [ UR * ( UPS * DBS ) ] + ( DBS * 24 )

Como obter as informações?

As informações de UNDO_RETENTION (UR) e DB_BLOCK_SIZE mencionadas na fórmula, podem ser obtidas consultando o arquivo de inicialização do banco de dados “init.ora” ou conectando-se ao banco de dados e executando o comando “SHOW PARAMETER”, deve-se informar a opção a ser verificada.

Para determinar o valor (DBS) deve-se utilizar o “select” abaixo:

SQL> SELECT BLOCK_SIZE AS DBS FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME = (SELECT UPPER(VALUE) FROM V$PARAMETER WHERE NAME = 'UNDO_TABLESPACE');

Para determinar o número de blocos de “UNDO” gerados Por Segundo (UPS), devem-se realizar consultas na view “V$UNDOSTAT”. O “select” abaixo apresentará o número de blocos gerados na atual área de “UNDO” e dividirá o número obtido por um intervalo de tempo, em segundos:

SQL> SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;

As colunas “END_TIME” e “BEGIN_TIME” são as os intervalos de dias a serem monitorados e a multiplicação pelo valor 86.400, irá transformar em segundos o número de dias.
A consulta irá retornar a geração “em blocos” por segundo. O valor obtido deverá ser multiplicado pelo DB_BLOCK_SIZE, que é o mesmo tamanho definido por cada bloco de “UNDO”.
O “select” abaixo, já substitui os valores da fórmula e calcula o número de bytes necessários ao ajuste dá área de “UNDO”

SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),
(SELECT (SUM(undoblks)/SUM(((end_time - begin_time)*86400))) AS UPS FROM v$undostat),
(select block_size as DBS from dba_tablespaces where tablespace_name=
(select upper(value) from v$parameter where name = 'undo_tablespace'));

Nota: O acompanhamento periódico desta área se faz necessário à medida que as aplicações e as janelas de processamento evoluem.


Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com