Oradata

Oracle Result Cache

Oracle Result Cache

O result cache é uma área de memória da instância que retém o resultado das instruções SQL para reutilização por outras sessões, a memória utilizada neste caso é a memória da shared pool, nela ficará contido o resultado de comandos “SELECT” e funções PL/SQL que estarão tirando proveito desta funcionalidade.

Quando determinado comando SQL (select ou uma PL/SQL function) é utilizado por repetidas vezes, o banco de dados pode armazenar o resultado destes comandos no result cache para ser reutilizado por outras sessões que executarem o mesmo comando, evitando então a execução repetida e desnecessária destes comandos, porém quando o dado (que está no result cache) é modificado o resultado é descartado do cache. O uso do result cache é recomendado para tabelas que tem altos índices de leituras e retornam baixa quantidade de registros e/ou tabelas read-only.

Benefícios do result cache.

Redução do tempo de resposta: com os dados retidos no cache, evita-se a repetida execução da query.

Maior eficiência no uso dos recursos: a redução de round trips pode resultar em um ganho substancial de performance e consequente economia de recursos como CPU e I/O. Uma vez que os dados estão em cache estes outros recursos podem ser liberados para outras tarefas dentro da instância.

Redução do uso de memória: Quando utilizado no lado do client há mais memória disponível para o servidor executar outras atividades (também há essa possibilidade).

Configuração do result cache:

Por default quando você inicializa a instância de banco de dados a memória destinada ao result cache é parte da shared pool, já com relação à quantidade de memória, isso vai depender do valor alocado para instância e como ele vai ser gerenciado, veja:

  • Com ASMM (automatic shared memory management):

Neste caso, a quantidade de memória para a shared pool é subtraída do valor atribuído ao parâmetro SGA_TARGET, sendo assim para o result cache é alocado 0,50% do valor da SGA_TARGET.

  • Com gerenciamento de memória manual:

Neste caso, o valor que será atribuído ao result cache é o correspondente a 1% da quantidade de memória da shared pool.

Exemplos de uso:

No exemplo acima, você pode ver no plano de execução que o resultado da query vem do result cache, pois na coluna “Name” do ID 1 informa que você obtém o resultado desta query de dentro do cache.

Metadados:

Com o select abaixo (na view V$RESULT_CACHE_OBJECTS), você consegue consultar os metadados de seu result cache (exemplo: data de criação, quantidade de blocos e linhas) para gerenciamento do mesmo.

Uma outra maneira de monitorar o comportamento de seu result cache é usar a package DBMS_RESULT_CACHE.MEMORY_REPORT. Além desta função, caso você queira limpar todo o seu result cache é possível usar a mesma package porém com a procedure FLUSH vide exemplo: exemplo DBMS_RESULT_CACHE.FLUSH;

Parâmetros:

Existem alguns parâmetros no SPFILE que você também pode usar para gerenciar o result cache.

  • RESULT_CACHE_MAX_SIZE: Quantidade de memória alocada para o result cache. (se quiser usar os valores padrão, defina-o para 0).
  • RESULT_CACHE_MAX_RESULT: Quantidade máxima de memória (em percentual) para o result cache, valor padrão 5%.
  • RESULT_CACHE_REMOTE_EXPIRATION: Tempo em minutos que os resultados das queries devem ser mantidos no result cache.

Exemplos de uso:

O result cache pode ser invocado pelas aplicações de duas maneiras, pelos hints /*+ RESULT_CACHE */ e também /*+ NO_RESULT_CACHE */ e nas definições das tabelas através das definições do parâmetro:

RESULT_CACHE (MODE DEFAULT | FORCE)

Vejamos alguns exemplos:

Com HINT NO_RESULT_CACHE:

Com o HINT RESULT_CACHE:

Exemplo com o parâmetro RESULT_CACHE na definição das tabelas:

Neste caso, ao criarmos as tabelas já podemos informar no parâmetro RESULT_CACHE qual será o comportamento conforme abaixo:

DEFAULT: Se especificado, em pelo menos uma das tabelas envolvida em um SELECT ou function PL/SQL o resultado não vai para o result_cache, a menos que o parâmetro RESULT_CACHE_MODE do SPFILE (ou na sessão) esteja especificado como FORCE ou o hint /*+ RESULT_CACHE +/ seja explicitamente escrito na query.

FORCE: Se todas as tabelas envolvidas em uma query ou function PL/SQL tiveram marcadas com o result cache neste modo, seu resultado sempre irá para o result cache.

Observação: Vale lembrar que o parâmetro RESULT_CACHE nas tabelas pode ser modificado com um ALTER TABLE… vide exemplo:

ALTER TABLE sales RESULT_CACHE (MODE FORCE);

Monitoramento:

Você pode monitorar o uso do result cache através de diversas views que o banco de dados oferece, com essas views fica mais fácil entender como está o uso deste recurso e se o mesmo está surtindo os efeitos esperados no que tange a performance de sua aplicação.

V$RESULT_CACHE_STATISTICS: Com essa view você coleta informações à respeito das configurações e uso de memória do result cache.

V$RESULT_CACHE_MEMORY: Lista todos os blocos de seu servidor que estão no result cache bem com suas estatísticas.

V$RESULT_CACHE_OBJECTS: Lista todos os objetos de seu banco de dados que possuem blocos alocados no result cache.

V$RESULT_CACHE_DEPENDENCY: Lista as dependências de objetos que estão no result cache vs objetos que não se encontram no mesmo.

DBA | ALL | USER _TABLES: Essas views possuem uma coluna chamada RESULT_CACHE que informa quais objetos estão definidos para usar o result cache ou não.

Abaixo alguns exemplos:

Monitoramento das estatísticas do result cache:

É isso aí, concluindo result cache é algo relativamente simples, porém se bem empregado pode lhe ajudar a ter significativos ganhos de performance, para maiores informações, você pode consultar a documentação oficial da Oracle.

Espero ter ajudado, forte abraço e até a próxima.

Douglas Paiva de Sousa

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *