Nesta série de artigos ‘Estruturas de memória do servidor Oracle 10g’,  tratamos sobre as estruturas de memória que compõem uma instância Oracle. Iniciamos nossa série com foco na SGA. Neste artigo, trataremos sobre o POOL COMPARTILHADO que é uma das estruturas de memória que compõe a SGA
 
O Pool Compartilhado
 

O Pool Compartilhado (Shared Pool) é uma das estruturas de memória obrigatória que compõe a SGA.

No Pool Compartilhado é onde são armazenados os objetos compartilhados globalmente pela instância.

Dentre os objetos compartilhados globalmente armazenados no pool compartilhado temos os planos de execução de instruções SQL, pacotes PL/SQL, procedimentos, funções...

 

O parâmetro de instância que define o tamanho limite do Pool Compartilhado é o SHARED_POOL_SIZE.

No exemplo acima, o Pool Compartilhado foi definido com tamanho de 50Mb.  Porém, ao consultarmos o tamanho do Pool Compartilhado para a instância através do comando 'show parameter', foi apresentado um tamanho de 52Mb para o Pool Compartilhado. Isso ocorre porque a instância está utilizando um tamanho de grânulo de 4Mb. Logo, para alocar 50Mb para o Pool Compartilhado, foram necessários 13 grânulos de 4Mb, totalizando 52Mb de espaço para o Pool Compartilhado.

 

É importante lembrar que o parâmetro de instância SHARED_POOL_SIZE é dinâmico, ou seja, podemos alterar o tamanho do Pool Compartilhado sem precisar tirar o servidor do ar.

 

O Pool Compartilhado divide-se em uma série de estruturas de memória. 
Para visualizá-las, podemos consultar a visão V$SGASTAT conforme exemplo abaixo:
 

 

O DBA não tem controle sobre o tamanho desta série de estruturas que compõe o Pool Compartilhado, pois o próprio Oracle gerencia as estruturas dinamicamente, dentro do limite especificado pelo parâmetro de instância  SHARED_POOL_SIZE.

 

Veremos agora algumas das estruturas mais importantes que compõem o Pool Compartilhado.

 

O Cache de Biblioteca

O cache de biblioteca é dividido em duas estruturas a saber:

- A área de SQL compartilhado: que são todas as instruções SQL que podem ser usadas por qualquer sessão do usuário.

- A área de PL/SQL compartilhado: que são as instruções da linguagem procedural compartilhadas pelas sessões.

 

Quando executamos uma instrução SELECT, o resultado retornado por esta instrução fica armazenado no cache de biblioteca, mais especificamente na área de SQL compartilhado. Caso uma outra sessão necessite das mesmas informações retornadas pela instrução SELECT recentemente executada, o servidor Oracle não precisa buscar essas informações em disco, pois as mesmas já estão em memória. Este mecanismo aumenta a performance do servidor Oracle.

 

A consulta abaixo nos exibem um tamanho da área de SQL compartilhado de aproximadamente 5Mb e um tamanho da área de PL/SQL compartilhado de aproximadamente 148Kb respectivamente.
 

 

O Cache de Dicionário de Dados

O cache de dicionário de dados compõe-se de informações do dicionário de dados(estruturas de tabelas, usuários, restrições, concessões, nome dos data files, entre outros) que estão sendo usadas para se interpretar as instruções SQL.
 
 
Os Buffers ASH
Os buffers ASH (Active Session History, ou Histórico da Sessão Ativa) armazenam informações relativas às atividades recentes dos usuários. Essas informações são utilizadas para diagnósticos de desempenho do servidor e são enviadas regularmente para o AWR (Repositório Automático de Carga de Trabalho do Oracle 10g) no tablespace SYSAUX.
 

Vale reforçar que todos os componentes do pool compartilhado são dimensionados automaticamente pela instância Oracle, ou seja, não temos controle sobre o tamanho de nenhum componente a não ser definindo o tamanho limite do pool compartilhado através do parâmetro dinâmico SHARED_POOL_SIZE.
 
Devemos ter em mente que um pool compartilhado pequeno demais prejudica o desempenho do servidor, porém um pool compartilhado excessivamente grande também prejudica o desempenho do servidor. Para determinarmos o tamanho ideal para o pool compartilhado podemos utilizar a visão V$SHARED_POOL_ADVICE conforme exemplo abaixo:
 
 
Primeiramente, temos que garantir que o parâmetro de instância STATISTICS_LEVEL esteja definido com o valor 'TYPICAL' para que o assistente esteja habilitado.

Depois consultamos a visão V$SHARED_POOL_ADVICE conforme consulta abaixo:
 

A consulta acima nos mostra a quantidade de tempo de parsing do cache de biblioteca que seria economizado se o pool compartilhado tivesse um determinado tamanho. A leitura é feita da seguinte forma: primeiro encontramos a linha onde a coluna 'Fator' é igual a 1. Esta linha define o tamanho atual do pool compartilhado, que em nosso exemplo é de 152Mb.
A visão nos mostra estimativas que vão desde a metade do tamanho atual até o dobro do tamanho do pool compartilhado.
 
Em nosso exemplo, o pool compartilhado é claramente muito maior do que o necessário; ele poderia ser diminuído para 88Mb sem nenhuma deteriorização significativa no tempo economizado.

 
No próximo artigo desta série - parte 3, trataremos sobre o BUFFER DE REDO LOG.