Oracle
 sql >> Base de données >  >> RDS >> Oracle

Cache des résultats

Je jouais avec le cache de résultats l'autre jour… je sais… ce n'est pas une nouvelle fonctionnalité et elle est disponible depuis un certain temps. Malheureusement, cela peut prendre un certain temps pour arriver aux choses, je suppose.

Dans mon test simple, j'avais une requête qui présentait ce comportement :

sélectionner
   max(det.invoice_date)
de
   factures i
rejoindre
   facture_détail det
sur i.dept_id=det.dept_id
 
call    count       cpu           disk      query   current       rows
------- ------  -------  -------- ---------- --------- - ---------  ---------
Analyse        1     0.00      0.00          0          0          0         0
Exécuter      1     0,00      0,00          0          0          0         0
Récupérer        2     2,77      6,66      75521      75583          0         1
------- ------  -------  -------- ---------- --------- - ---------- ---------
total        4     2,77      6,67  75521 75583          0         1 

75 000 lectures de disque pour renvoyer 1 ligne. Aie! Maintenant, exécutez-le dans le cache de résultats et obtenez de très bons chiffres. 🙂

sélectionner
   /*+ result_cache */
   max(det.invoice_date)
de
   factures i
rejoindre
   facture_détail det
   sur i.dept_id=det.dept_id
 
appel     nombre     cpu   écoulé       disque      requête    lignes       actuelles
------- ------  ------ --------- ---------- --------- - ----------  ---------
Analyse        1    0.00      0.00          0          0          0          0
Exécuter      1    0,00      0,00          0          0          0          0
Récupérer        2    0,00      0,00          0          0          0          1
------- ------  ------ --------- ---------- --------- - ----------  ---------
total        4    0,00      0,00          0 0          0          1 

Toujours 1 ligne renvoyée mais zéro lecture de disque, zéro bloc actuel et pratiquement aucun temps écoulé. Génial !

Le cache de résultats fonctionne mieux lorsqu'il renvoie un petit nombre de lignes sur des tables qui ne changent pas souvent. Les opérations DML sur les tables sous-jacentes invalideront l'entrée du cache de résultats et le travail devra être effectué à nouveau avant d'être stocké dans le cache de résultats.

Bientôt, quand j'en aurai l'occasion, je vais comprendre l'impact des variables de liaison sur les requêtes qui utilisent le cache de résultats.