Monter des données dans le cache Oracle

Lorsqu'Oracle doit accéder à un bloc de données, il regarde dans un premier temps si celui-ci n'est pas déjà présent dans le cache (au sein de la SGA) car l'accès aux données du cache (RAM) est grandement plus performante que l'accès au données sur disque.

Les tables de petites volumétries et fréquemment requétées (comme les tables de paramètres) sont candidates à rester en cache.

Après un redémarrage, ou une chaîne de batch nocturne, le cache peut être réinitialisé. On observe alors les premiers traitements du jour plus lents que la moyenne.
Il existe cependant différents moyens pour définir la montée en cache des données d'une table.

A la création de la table


Gràce à la clause cache à la création d'une table, on peut indiquer la mise en cache des données :

create table parametre (id_param number, value varchar2(120))
cache;


Ce paramètre peut également être modifié à chaud à partir d'un ordre alter :

alter table parametre cache;


La commande pour réinitialiser (nocache est la valeur par défaut) :

alter table parametre nocache;



Il est commun d'appliquer par la même occasion la clause storage afin de spécifier le stockage des données (dans quel tampon elle sera chargée, à savoir default, keep ou recycle) :

alter table parametre cache storage(buffer_pool keep);


Lors d'un select, par un hint


Il existe également un hint (cache) permettant d'indiquer, dans un select, de mettre les données en cache, en général, on l'associe à un hint full afin d'être sûr que le parcours se fait sur un full scan :

select /*+ FULL (parametre) CACHE(parametre) */ value
from parametre;


Celà peut notamment être utile si l'on veut automatiser un premier traitement après des batch de nuit qui auraient remplacés le cache ; mais sans pénaliser ces batchs par la présence des données dans le cache de la table du jour pendant la nuit.


Cache du résultat gràce à un hint


Depuis la version 11g, Oracle propose un hint supplémentaire : /*+ result_cache */ lors d'une requête select.
Ce hint permet d'indiquer à Oracle de garder le résultat de la requête en cache. Ainsi, si la même requête est à nouveau exécutée, Oracle ne réévaluera pas la requête et utilisera le précédent résultat, et ce pour tout les clients car il s'agit bien du cache en SGA, et non en PGA (propre à chaque client).

select /*+ result_cache */ count(*) from commande;

Cache du résultat au niveau session


De la même manière que pour le hint, le paramêtre RESULT_CACHE_MODE a été introduit (modifiable au niveau système et session) pour les besoins au niveau d'une requête (3 possibilités : AUTO MANUAL et FORCE). De cette manière un job préliminaire à des batch peut être lancé afin de mettre en cache les résultats des requêtes utiles :

alter session RESULT_CACHE_MODE FORCE;
select count(*) from commande;
select count(*) from facture where reglee = 'Y';


Attention tout de même à l'utilisation de ces 2 dernières méthodes qui ne garantissent pas l'intégrité des données lors de transactions concurrentes. Il peut néanmoins être utile sur des activités de statistiques utilisant les mêmes requêtes ou sous-requêtes sans modification.
Voir le tutoriel site le site d'Oracle (en).

Voir également
- les paramètres de l'instance Oracle
- comment vider le cache
- les hints Oracle
- Comparer l'exécution d'une requête avec 2 index différents




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories