quinta-feira, 13 de maio de 2010

AUMENTANDO SUA DISPONIBILIDADE PARA SORT'S ( Oracle Database 11gR2 - TEMPGROUP )

Olá para todos, como estão vocês?

Bem, eu venho aqui hoje para dividir com vocês uma pequena parte dos meus estudos em 11g, que se iniciaram assim que comprei o livro Manual do DBA 11g , e desde então venho lendo aos poucos e tentando atualizar meus básicos conhecimentos em Banco de Dados.

Foi em uma dessas leituras que me deparei com algo que para mim é novo, para muitos de vocês que leêm o BLOG ou que já são DBA's a muitos anos deve sem algo trivial.

Eu estou me referindo a utilização de um TEMPGROUP para aumentar a disponibilidade de área de Sort,  bem como eliminar possiveis contenções e ou facilitar a administração dessa área que é teoricamente "descartável".

Vamos ao assunto então?
Espero que apreciem.

O AMBIENTE 

Partiremos do principal, que é informar em que ambiente isso foi testado e implementado, eu utilizei a seguinte tecnologia :

Versão do Sistema Operacional : Oracle Enterprise Linux 5 Update 4 - 64bits
Versão do Banco de Dados : Oracle Database Enterprise 11g Release 2


Bem esclarecido isso, podemos ir ao desenrolar do nosso assunto.

VERIFICANDO A UTILIZAÇÃO DE GRUPOS DE TABLESPACE

Antes de implementarmos tal recurso, é necessário que façamos antes uma breve verificação a respeito dos grupos de tablespace existentes em nosso Database, que seria através de um SELECT na visão DBA_TABLESPACE_GROUPS, vejam :

DBA_TABLESPACE_GROUPS

DBA_TABLESPACE_GROUPS describes all tablespace groups in the database.
Column Datatype NULL Description
GROUP_NAME VARCHAR2(30) NOT NULL Name of the tablespace group
TABLESPACE_NAME VARCHAR2(30) NOT NULL Name of the tablespace




Resolvida essa questão de estarmos utilizando ou não vamos então as configurações para que possamos utilizar um grupo de tablespaces, no nosso caso para TEMP.

PREPARANDO O BANCO PARA AS NOVAS CONFIGURAÇÕES

Notadamente muitos de vocês já sabem o que é um segmento TEMP para o Oracle, seja ele uma tabela ( Global Temporary Table) ou uma Tablespace ( TEMP), mas como pra DBA conceito nunca é demais ( risos), ai vai mais uma vez pra fixar bem :


TEMP :  as tablespaces TEMP são usadas para operações de classificação ( SORT), e servem também como repositório para as tabelas GLOBAIS ( Global Temporary Tables).
O Oracle não fará a operação de classificação em memória, para isso é alocado um segmento de classificação ( SORT) que tem por função realizar esta tarefa.  Essas são as operações que envolvem diretamente essa área de classificação que o Oracle nos disponibiliza :CREATE INDEX, ANALYZE, SELECT  DISTINCT, ORDER BY, GROUP BY, UNION, INTERSECT, MINUS, Sort-Merge JOINS, etc

Bom, conceituado nosso segmento TEMP podemos partir para as preparações. Na figura mostrada acima , vocês podem notar que eu possuo apenas um único TEMPFILE relacionado a minha tablespace TEMP. Vamos devagar, O QUE É MESMO UM TEMPFILE?

TEMPFILE : Caracteristicamente diferente de um datafile comum de outras tabelspaces de dados, o TEMPFILE não é igual aos demais, pois quando um TEMPFILE é criado o Oracle apenas escreve seu cabeçalho e seu ultimo bloco, marcando assim o ponteiramento de onde ele inicia e termina, é dessa caracteristica que deriva a velocidade que encontramos sempre que precisamos criar um TEMPFILE novo. 
Outra coisa importante a cerca dos TEMPFILES é que eles não são gravados no CONTROLFILE ( Para saber mais sobre o que é um CONTROLFILE acessem : http://www.rodrigoalmeida.net/blog/index.php/o-que-e-um-control-file/ , isso implica que seus TEMPFILES só podem ser recriados em processos de restauração do banco de dados. Todas essas particularidades a cerca dos TEMPFILES nos remetem a pensar nas possibilidades infinitas de modelos de configurações em todo tipo de ambiente, seja RAC, STAND-BY, LOCAL enfim , sejam criativos.


CRIANDO TEMPORARY TABELSPACES ADICIONAIS

Bem, depois de um pouquinho de conceitos acima, vamos agora criar nossas tablespaces adicionais que irão nos auxiliar a formar o nosso TEMP GROUP , veja :


 A respeito da tablespace adicionada só tenho uma observação a fazer, eu a criei com 20MB para acompanhar o padrão da que já existia, visto que se trata de um ambiente controlado este onde está sendo realizado esse teste, em seus ambientes vocês podem mensurar melhor e dividir proporcionalmente suas TABLESPACES e tamanhos de acordo com suas necessidades ok?




Muito bem, na figura acima eu evidencio á vocês as minhas 3 tablespaces já devidamente criadas e disponiveis para uso. Muitos podem questionar o seguinte : AH! DAVID ISSO É FACIL EU TENHO 3 TABLESPACES TEMP , AGORA É SÓ EU PEGAR MINHA QUANTIDADE DE USUÁRIOS CONCORRENTES DIVIDIR POR 3 E SEPARAR CADA UM PARA USAR UMA DIFERENTE , NÃO É? Se essa pergunta fosse feita ao Sheldon da mini-série THE BIG BANG THEORY com certeza a resposta sseria "BAZZINGA!".


Mas respondendo a essa pseudo questão, não não é a mesma coisa, o que estamos querendo aqui é aumentar a disponibilidade de maneira inteligente e usando as features que nosso Banco nos permite usar, até porque se a opção que citei acima fosse usada você teria de fato contenções em um mesmo arquivo , pois um usuário poderia abrir mais de uma sessão e usar a mesma tabelspace e consequentemente o mesmo tempfile.


ATRIBUINDO AS TABLESPACES A UM GRUPO 


Vamos em frente então, agora iremos atribuir as nossas 3 tablespaces TEMP, TEMP1 e TEMP2 a um grupo em comum de tablespaces temporárias, vejam :




Pode surgir a pergunta : EU NÂO PRECISO CRIAR MEU GRUPO PRIMEIRO? e a resposta é baseada na celebre frase "UMA IMAGEM VALE MAIS QUE MIL PALAVRAS.", vejam que na figura acima bastou eu executar um mero ALTER TABLESPACE para que as 3 tablespaces passassem a fazer parte do meu grupo TMP_GROUP.


Agora que tla então revisitarmos a nossa visão DBA_TABLESPACES_GROUPS e ver oque mudou em seu conteúdo após essa nossa pequena alteração? Notem :




BINGO!!!..Obtemos então a informação de que, agora temos em nosso Database um grupo de tabelspaces gerecialmente organizados no meu TMP_GROUP. Outro questionamento pertinente seria : PRONTO AGORA JA ESTA NO ESQUEMA? Não muita calma , ainda faltam alguns passos para que isso se torne oficial e disponivel para uso, não se pode casar duas pessoas sem o padre não é mesmo???. Desculpem a espirituosidade, é que gosto de escrever assim.


Voltemos então ao nosso esquema de configuração, agora que já temos as tablespaces criadas, disponiveis e relacioandas a um grupo , podemos então fazer com que nosso Database interprete isso e começe a se utilizar desse recurso. COMO?


ALTERANDO CARACTERISTICAS PADRÕES DO DATABASE


Por padrão ao criar um banco você tem criada uma Tablespace TEMP apenas, até o 10g nós podiamos ter "N" arquivos de tablespaces TEMP no banco, porém apenas um podia ser ativado, no 11 g com o TEMPGROUP isso mudou, podemos checar qual a tablespace TEMP ativa do nosso banco de dados através da visão DATABASE_PROPERTIES :


DATABASE_PROPERTIES

DATABASE_PROPERTIES lists Permanent database properties.
Column Datatype NULL Description
PROPERTY_NAME VARCHAR2(30) NOT NULL Property name
PROPERTY_VALUE VARCHAR2(4000) Property value
DESCRIPTION VARCHAR2(4000) Property description


Com um SELECT obtemos nossa resposta :

 Reparem que uma única tablespace está sendo enxergada pelo nosso Banco de Dados, que é a que foi criada juntamente com a nossa Instance, ou seja, a TEMP.

Bem, já cientes dessa informação e querendo altera-la para que possamos usar nossos recursos de maneira eficiente e eficaz , o que devemos fazer então?

A resposta é tão simples como a pergunta, devemos ALTERAR as caracteristicas do nosso Banco, como fazelo? Vejam :


Atentem ao detalhe, na linha superiro da imagem na minha sessão SQL*Plus eu executo um comando ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TMP_GROUP, essa instrução SQL fará com que meu banco de dados entenda que agora ele não mais usará apenas a tablespace TEMP como fonte para suas operações de classificação, ele agora conta com o reforço de um grupo, ou seja, 3 tablespaces temp com caracteristicas identicas para operações de classificação.

Feito isso, ainda tem um passo a ser realizado que é também importante.

ALTERANDO OS USUÁRIOS PARA USAREM O TEMP GROUP

Vamos recapitular um pouco, nós já :

- criamos as tablespaces adicionais
- vinculamo-as a um grupo
- alteramos nosso banco para usar o grupo
- disponibilizamos para uso a nova área de TEMP
- ?

Faltou apenas agregar os usuários a essa área, veja como pode ser feito :

 Inicialmente nossos USERS/OWNERS , vem configurados para utilizarem a TEMPORARY TABLESPACE TEMP, que é a que por padrão é criada junto com o nosso Banco, se você já tiver com seus usuários criados basta proceder com a instrução ALTER USER nome_do_user TEMPORARY TABLESPACE TMP_GROUP, isso fará com que ele passe a usar estes segmentos em grupo, se o seu caso for um usuário novo proceda como na figura acima que também você estara habilitando o usuário a usar estes segmentos.

JUSTIFICANDO AS ALTERAÇÕES

Bom, eu falei, acredito que expliquei , como fazer tudo isso, porém muitos podem se questionar quanto a importancia e real necessidade de tal tarefa.

Eu digo á vocês algumas dessas razões, ou pelo menos a principal delas que é GANHOS, pois com essa implementação você não só reduz contenções em TEMP, como também fornece aos usuários concorrentes a chance de usar diferentes segmentos de classificação a cada sessão nova, pois eles serão gerenciados pelo grupo e o grupo através de um algoritmo irá enviar a requisição de ara de classificação ( SORT_AREA_SIZE) para um determinado tablespaces que possui determinados TEMPFILES. Isso aumenta é melhora o tempo de resposta de muitas aplicações que usam bastante as opções de classificação.

Bom pessoal, pra fechar quero agradecer a todos que aqui vem , seja pra deixar comentários, fazer criticas, elogiar apenas ou até mesmo só ler. Espero que vocês sempre estejam por aqui e se sintam a vontade para entrar em contato e mandar também sugestões.

Obrigado á todos e até a próxima.

Bibliografia Digital Utilizada : Oracle DBA Handbook 11g
                                                   http://www.oracle-base.com
                                                   http://www.rodrigoalmeida.net
                                                   http://www.orafaq.com