*Novas tumas TWS:* Acesse o site e fa硠sua inscri磯. At頒$ 500,00 em
descontos!<http://www.twstecnologia.com.br/>

<http://www.twstecnologia.com.br/>
<http://www.enpo-br.org/><http://www.profissionaloracle.com.br/>
Ajustes de Memória: Shared Pool

*#Ajustes de Memória na Shared Pool#*

**Shared Pool. Pra que ela serve?
- É uma área para compartilhamento.*

*- O que ela tem: Comandos e planos de execução dos últimos comandos
executados. É bom, pois O oracle pula boa parte do parse, pois a shared pool
armazena os planos de parses realizados anteriormente.*

**Library cache:** É onde é armazenado o texto propriamente dito, o código
compilado e o plano do seu comando. É usado pra SQL e PL/SQL. Ex.:
procedure, select.*

**Cache do dicionário de dados:** é armazenado todas as informações
necessárias pra validar o seu comando. Ele Consulta no dicionário do disco
que fica na tabela system. Funciona totalmente em função do library cache.*

*Obs.: Um mecânismo do oracle muito utilizado pelas áreas de memória é o LRU:
O oracle joga a informação que faz mais tempo que não é utilizada. *

**UGA:** É um pedaço da PGA. É uma subdivisão do PGA. Se você utiliza um
servidor compartilhado, ela vai ficar dentro da SGA. Pois é na SGA que ficam
as áreas compartilhadas.*

*- Sempre que um novo objeto (objeto que ainda não esta na memória) for
necessário, você vai precisar de espaço para alocá-lo. É o 1º passo do plano
de parse. Você tem q alocar um espaço em memória na shared pool.*

*- Objetos recriados são eliminados do cache: O oracle precisa revalidar o
código que está em memória.*

*- Objetos fixos são compostos de pedaços contíguos (chunks) de memória: Nem
sempre uma package vai estar inteiro na memória ( Normalmente fica
fragmentada: Um pedaço aqui outro lá).*

*-Armazena metadados complexos dos cursores: Armazenas informações para
planos de execução: Objetivo: evitar reparse, e compartilhamento.*

**Como o oracle controla os dados que vão entrar na shared pool?
-Ele controla por regiões, por pedaços em que ele pode alocar comandos.
(pedaços contíguos (chunks) de memória).*

*- Existe um mecânismo de proteção de áreas de memória. O oracle tem um
mecânismo parecido com o lock em tabelas. Ele se chama LATCH.*

**LATH:** É um mecanismo que protege as áreas de memórias, semelhante como o
lock protege tabelas/objetos em disco oracle.*

**A Diferença entre latch e lock.**
- O lock pode ser muito demorável. Enquanto o latch é extremamente rápido,
ele funciona normalmente em milésimos de segundo.*

*- O latch é instantâneo, mexeu na área de memória (a procedure colocou o
código) e está liberado. Não precisa do commit como no lock.*

*- No lock, quando você executa um DML com sucesso e eu tento fazer na mesma
linha que a sua, o oracle enfileira, e eu fico preso. E sucessivamente.*

*- Latch é um mecanismo genérico que protege as áreas de memória.*

**Eu posso ter problemas de performance se eu superdimensionar minha área de
memória?**
Sim. Pois ele ficar super ocupado analisando a área superdimensionada.*

**Como eu faço pra saber se a minha shared pool está funcionado bem?**
- Através do script Statspack, que a oracle disponibiliza. Após sua execução
será gerado um relatório detalhado sobre o funcionamento da shared pool. *

*- Hard parse: é o nome dado quando o parse foi realizado por completo (o
oracle procurou em memória e nao achou, e teve q fazer todas as fases do
parse). Trabalho pesado.*

*- Soft parse – É quando a shared pool encontra o comando em memória, mas
mesmo assim é necessário uma parte do parse, pois ele precisa ver se você
tem privilégios (ele pulou o plano de execução). Logo, Ele faz uma parte
pequena do parse.*

**Existe algum caso em que o oracle não precise fazer nenhum tipo de
analise/parse?**
Existe. Sim. Se você na mesma sessão, executou o mesmo comando.*

**Como eu consulto informações sobre o funcionamento da Library cache? Que
fica na shared pool. **Através da view de desempenho:*

*V$LIBRARYCACHE**; uma view q mostra o funcionamento da L.C.*

*INVALIDATIONS**; Mostra as procedures que estão em memória, essa procedure
faz menção a uma tabela x,uma select ou update.*

*- O que acontece se eu coletar nossas estatísticas para a tabela? **
Aquele plano de execução pode nao ser válido ou a melhor opção. Isso indica
que o objeto pl/sql pode ser invalidado. *

**Isso se chama invalidação em memória: Quando o oracle marca como não sendo
mais atual. Logo, ele precisa fazer um novo parse para verificar se este
ainda é o melhor plano para esse comando.
- Isso é bom ou ruim pra performance?
Ruim. Pois o oracle vai ter que fazer o trabalho de validação e parse. Se
agente pensa num ambiente pesado, muita gente utilizando o banco, muitas
sessões ativas. O banco nas primeiras versões chegava até a cair por causa
de bug no library cache. Dica do professor: Não altere código durante
horário de pico.
Qual a recomendação do oracle pra invalidations?
Próximo de zero. O ideal é zero. Se você faz isso em horários foras de pico
provavelmente gerará poucos invalidations.*

*SELECT ROUND(SUM(PINHITS)/SUM(PINS) * 100,2) "Eficiência - Library Cache"
FROM V$LIBRARYCACHE;*

*Dica:** A imensa maioria dos comandos iniciais desse percentual é ruim ao
subir o banco. O ideal é esperar o banco subir, normalizar seu
funcionamento/uso diário e aguarda umas 3 horas para gerar esse script;
- Em linhas gerais a oracle recomenda que esse número seja acima de 90%.
Caso seja menor, pode ser um problema de shared pool.*

**O que esta query acima quer dizer? Se você aumentar a memória qual o ganho
estimado?**
- Se você aumentar a shared pool a performance vai continuar igual.*

*- O oracle tem uma serie de indicadores pra você tomar uma decisão. De
acordo com a amostragem e análise deles todos é q você deverá tomar uma
decisão, e nunca tomar uma decisão por um valor de um indicador isolado.
(Isso é uma palavra final? Não. É apenas um indicador).*

** O trabalho de ajuste tem 2 perfis:*

*- Perfil pró-ativo: monitorar, analisar os indicadores antes q a casa caia.
Olhe os indicadores pra ver se as coisas estão indo bem ou mal.
Periodicamente e com um foco especial: em momentos críticos do meu sistema,
fechamento de mês, na atualização do oracle, quando entrou novos
funcionários,etc. Em outras palavras: Quando mudar alguma coisa. O
interessante é verificar periodicamente.*

*- Trabalho reativo: Já estão reclamando que está ruim. Você vai analisar a
memória, analisar disco e esses indicadores.*

**Um outro tipo de Problema na shared pool é a Fragmentação de memória: pois
existem objetos de tamanho e utilização muito diferentes, e pelo jeito que o
oracle utiliza a shared pool. Pois um único comando pode ter eliminado
vários outros comandos na memória, pois teve que retirar os outros comandos
prontos pra serem executados para alocar um comando maior na memória. Isso
gera perda performance.*

**São causados por quem?**
- Por objetos grandes.*

**Como oracle procura minimizar esse problema?**
- Ele faz o seguinte: eu pego um pedaço da shared pool e vou reservar esse
pedaço pra comandos muito grandes. Os objetos grandes vão disputar em uma
área específica para objetos grandes. E o resto da área não reservada será
disputada por objetos menores. Agora vai entrar um comando grande e irá sair
um outro grande. Com esse procedimento eu evito fragmentação e perda de
performance. Uma das maneiras de evitar a fragmentação é usar a área
reservada. O parâmetro da área que determina o tamanho da shared pool.
Obs. Por default o oracle configura 10% da shared Pool pra comandos muito
grandes.*

**O que eu como DBA posso fazer para minimizar a fragmentação?**
- Evitar que os comandos grandes saiam da memoria. Existe uma maneira no
oracle de você pregar um objeto em memóra (esse comando nao sai mais). Esse
comando passar a ser isento do mecanismo LRU.
Obs.: Baixou o banco zera. Logo, você tem q fixar novamente.*

** Quais os comandos ideais pra fixar?Como determina isso?**
- Os comandos idéias são os objetos q são muito usados. Em outras palavras,
com muita utilização e que são grandes.*

*Ex.: Você carrega uma query (select), ele ocupa um bloco, com seu
cabeçalho, plano de execução e tudo mais, depois você carrega uma procedure
que ocupa um outro grande espaço em memória, depois uma package, outra
query, e outra query. E assim vai carregando minha memória:*

**Quanto estiver quase toda ocupada, o que o oracle vai fazer?**
- Vai retirar o comando Menos recentemente usado.*

**Como falo para o Oracle que eu quero fixar um objeto na shared pool?**
- Usa a package: EXECUTE DBMS_SHARED_POOL.KEEP(‘OWNER.OBJETO’);*

*- Para retirar: EXECUTE DBMS_SHARED_POOL.UNKEEP(‘OWNER.OBJETO’);*

**Qual a visão que mostra os comandos na shared pool?***

*v$sql_area**; mostrar as querys *

*v$db_object_cache**; ela diz os objetos do banco de dados que estão em
cache.*

*select owner,name from v$db_object_cache where kept=’yes’ and
owner=’scott’.*

*Obs.: Eu quero limpar minha shared pool. Você utiliza o comando: ALTER
SYSTEM FLUSH SHARED_POOL; Mesmo que você deseje limpar tudo você não vai
conseguir tirar os comandos q estão fixos.*

*Obs.: Uma dica de manutenção do DBA:**
Antes de baixar o banco, verifique os objetos mais utilizados. E depois
quando for rodar: Você roda o rdbms pool nesses arquivos.
- Esse procedimento evita a perda de performance: Pois os principais
comandos já vão estar em memória.*

**Para descobrir quais os objetos mais utilizados:***

*desc v$db_objects_cache***

*executions;** indica a quantidade que essa query/comando teve.*

*Sharabale_man**; tamanho do comando em memória, em bytes. Mostra quanto de
espaço o comando ocupa em memória.*

**Fixar uma query (Ex.:um select), pode ser interessante?**
- Sim. Se for um comando sql grande e que é efetuado muitas vezes.
Como que faço?
Através do comando:
desc dbms_shared_pool*

**Limpeza da Shared Pool.***

*- Se você define que precisa alterar o tamanho da shared pool, qual o
parâmetro que determina o tamanho da shared pool?*

*- Através do Parâmetro: shared_pol_size. Este é um parâmetro dinâmico (logo
você pode aumentar ou diminuir seu tamanho com o banco em funcionamento).*

**Como faço para visualizar o valor do parâmetro?**
- Através do comando: show parameter shared_pool_size*

*Ex.: alter system set shared_pool_size=300M*

** Os Parâmetros para controlar a memória:**
- Ex.: sga_max_size = indica o Limite da SGA. Em outras palavras, determina
o limite de tamanho da SGA. (A soma das áreas da minha SGA)*

*- A sga_max_size é um parâmetro estático, ou seja, não é possível fazer
alteração com o banco funcionando.*


-- 
--------------------------------------------------------------
Raul Francisco da Costa Ferreira de Andrade
DBA - OCA - Oracle Certified Associate
COBIT Foundation 4.1
Fone: (41)8855-8874 Brt
email: raulf...@gmail.com
Skype: raul.andrade
www.clickdba.com
"Não somos seres humanos passando por uma experiência espiritual
Somos seres espirituais passando por uma experiência humana."


[As partes desta mensagem que não continham texto foram removidas]

Responder a