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