Oracle Result Cache

299 views 9:05 pm 0 Comments junho 23, 2025

Você já ouviu falar do Oracle Result Cache? Se não ouviu, dá uma lida aqui abaixo porque vai ser bem interessante e muito provavelmente ele vai te ajudar em alguma situação.

O Oracle Result Cache é um recurso do Oracle Database projetado para impulsionar o desempenho de aplicações ao armazenar em memória os resultados de consultas SQL e funções PL/SQL. Em vez de reexecutar operações custosas repetidamente, o cache permite que o Oracle retorne resultados pré-calculados rapidamente, agilizando as respostas e otimizando o uso de recursos do sistema. Com opções de cache no servidor (compartilhado por todos os usuários) e no cliente (específico para cada aplicação), essa funcionalidade é ideal para dados que não mudam com frequência, oferecendo uma maneira eficiente de reduzir a carga no banco de dados e melhorar a experiência do usuário. Vamos ver em isso em detalhes.

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 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: 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: 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

Até o próximo post. Tchau!