Suivre ce blog
Administration Créer mon blog
26 novembre 2008 3 26 /11 /novembre /2008 20:33

Bonsoir,

Oracle 11 offre la possibilité de conserver le résultat d'une requête en cache. Pour cela, il suffit d'ajouter le hint /*+ resultat_cache */ dans votre requête. Alors allons y pour la preuve par l'exemple:

Pour cela, j'ai un user lao qui dispose d'une jolie table T3(i number,j number) de 40 millions de lignes, et je suis amené à faire des select count(*) dessus régulièrement.



sqlplus /nolog
connect lao/lao

SET AUTOTRACE ON
SELECT COUNT(*) FROM T3;


Résultat des courses :

Temps d'execution :9 secondes

60868 consistent gets et autant de lectures physiques, et globalement j'aurai le même résultat en rejouant la requête plusieurs fois.

Utilisons notre hint.


SELECT /*+ result_cache*/ COUNT (*) FROM T3;


Résultat:

La première execution donne bien evidemment le même résultat que sans le hint.

Mais la ou cela devient interessant, c'est lors des autres appels que ce soit dans ma session en cours ou depuis une autre session. Le résultat devient instantané et pour cause, puisqu'Oracle va chercher uniquement le résultat en cache.

Deux constatations:

  1. On peut voir dans le plan d'execution l'apparition d'une ligne indiquant pour la colonne opération "Result cache". Ce qui nous montre bien qu'ORACLE soit allé chercher l'information dans le cache.
  2. On peut également constater, dans les statistiques 0 consistent gets et 0 lecture physiques. Ce qui explique le coté instantané du résultat.


Remarque: Il convient d'utiliser cette technique sur des tables relativement statiques et savoir que potentiellement le résultat de la requête ne refletera pas la réalité du moment.

LAO.









Partager cet article

Published by LAO - dans ORACLE 11
commenter cet article

commentaires

Franck 28/11/2008

Salut LAO,

une question: c'est quoi le nolog dans l'ouverture de SQL*Plus ?

Sinon, l'option mise en cache c'est cool, surtout lorsque l'on a une procédure stockée qui pour des besoins de traitements internes doit relancer X fois la même requête.

Mais d'après toi, dans un cas équivalent qu'est-ce qui est le plus performant: l'utilisation d'un tableau avec un BULK COLLECT ou bien l'utilisation du hint et d'un curseur ?