*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]