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!