Vote utilisateur: 3 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles inactivesEtoiles inactives
 

Définition du result_cache

Une nouvelle fonctionnalité de la version 11g d'Oracle est l'introduction du cache de résultat ou "Result Cache". Ce cache est différent du cache de block déja présent ou db_cache/SGA. Il s'agit d'un cache en base de données coté base de données pour les jeux de données renvoyés par les requêtes ou des sous-requêtes.

Le cache de résultat est intégré dans le pool partagé (shared pool), il est utilisé par toutes les sessions sauf s'il est considéré comme invalide. L'invalidité d'un cache de résultat est déclaré lorsqu'un des objets utilisés par la requête est modifié.

Les requêtes qui balayent un grande quantité de blocks et retourne une faible quantité de données sont des bonnes candidates pour le result cache. Les requêtes de type décisionelle correspondent donc bien à cette définition.

Un paramètre d'initialisation : RESULT_CACHE_MODE permet de déterminer le comportement de la base :

  • MANUAL (défaut): il est nécessaire de spécifier le hint "result_cache" pour indiquer que l'on souhaite utiliser le cache de résultat.
  • FORCE : tous les résultats seront stockés en cache (s'ils respectent les limitations)

 

Les paramètres de limitation

Des paramètres d'initialisation permettent de limiter la consommation mémoire :

  • RESULT_CACHE_MAX_SIZE
    • Définie la taille du cache
    • désactive le cache de résultat si positioné à 0
    • Par défaut il dépend d'autres paramètres mémoire (0.25% de memory_target, ou 0.5% de sga_target, or 1% de share_pool_size)
    • Ne peut pas dépasser 75% du shared_pool
  • RESULT_CACHE_MAX_RESULT
    • Définie la taille maximum pour un seul résultat
    • Défaut à 5%
    • paramètre au niveau system ou session
  • RESULT_CACHE_REMOTE_EXPIRATION
    • Définie le temps d'expiration du cache qui dépend d'objets distants (DBlink)
    • Défaut à 0 (ce qui implique que le cache de résultat ne doit pas être utilisé sur des objets distants) 

Utiliser le hint "result_cache" 

Utilisation du hint RESULT_CACHE
SELECT /*+ RESULT_CACHE */ cod_moi, SUM(mtt_vte_brt), SUM(mtt_vte_net), SUM(mtt_cou) 
FROM a_vte_jou, d_jou
WHERE a_vte_jou.cod_jou=d_jou.cod_jou
GROUP BY cod_moi
  

 Lorsque le hint result_cache est présent, Oracle vérifie si un cache de résultat valide est disponible en mémoire. Si ce cache valide existe, le résultat est récupéré du cache directement. Si ce cache n'est pas disponible, la requête est éxécutée normalement, le résultat est retourné au client et si le résultat est suffisament petit par rapport aux limitations, le résultat est également conservé en mémoire en tant que cache.

hint NO_RESULT_CACHE
SELECT /*+ NO_RESULT_CACHE */ cod_moi, SUM(mtt_vte_brt), SUM(mtt_vte_net), SUM(mtt_cou) 
FROM a_vte_jou, d_jou
WHERE a_vte_jou.cod_jou=d_jou.cod_jou
GROUP BY cod_moi
  

 Si le mode RESULT_CACHE_MODE est à FORCE et que vous ne souhaitez pas avoir de cache pour certaines requêtes vous pouvez utiliser le hint "NO_RESULT_CACHE"

Gestion du result_cache

Le package systeme DBMS_RESULT_CACHE permet de connaitre l'état et le contenu du cache et permet d'avoir des actions de purge ou d'invalidations:

DBMS_RESULT_CACHE PACKAGE
-- Status du Cache
SELECT DBMS_RESULT_CACHE.STATUS FROM DUAL;
 
--Rapport sur l'usage du cache de résultat
EXECUTE DBMS_RESULT_CACHE.MEMORY_REPORT;
 
--Vidange de tous les caches de résultat
EXECUTE DBMS_RESULT_CACHE.FLUSH;
 
--Invalidation des caches de résultat spécifiques
EXECUTE DBMS_RESULT_CACHE.INVALIDATE('A_VTE_JOU','A_STK_JOU'); 

Il existe également des vues systèmes permettant de connaitre certaines informations par rapport aux caches de résultats : 

Vue Contenu
V$RESULT_CACHE_DEPENDENCY détails des liens entre caches de résultats et leurs dépendances
V$RESULT_CACHE_MEMORY Blocks mémoire et statistiques associées
V$RESULT_CACHE_OBJECTS Objets (caches de résultats et dépendances) avec leur attributs
V$RESULT_CACHE_STATISTICS statistiques sur l'usage des caches et de la mémoire

 

 

 

 

Quelques considérations sur le cache de résultats

Le cache de résultat est désactivé pour les requêtes contenant :

  • des tables temporaires
  • des tables systèmes
  • des séquences CURRVAL et NEXTVAL
  • les fonctions SYSDATE, CURRENT_DATE, SYS_GUID
  • DML ou  DDL sur des bases distantes
  • des fonctions PL/SQL non déterministes

Le cache de résultat ne libère pas automatiquement la mémoire, il augmente jusqu'à son maximum.
La procedure DBMS_RESULT_CACHE.FLUSH purge la mémoire.

Avec les variables bindées, le cache de résultat n'est découvert qu'avec les mêmes valeurs pour les variables.