Suite
à la demande de mon cher et valeureux ami et frère, Joël Mengolo a qui j’exprime
toute ma gratitude, j’aimerais compléter cet article en parlant en profondeur de
la gestion d’une zone de mémoire PGA et du nouveau paramètre introduit dans la
version 12c, PGA_AGGREGATE_LIMIT.
Historique :
Il
faut dire que le paramètre PGA_AGGREGATE_TARGET
a été introduit avec la version Oracle Database 9i, remplaçant ainsi les paramètres
SORT_AREA_SIZE et HASH_AREA_SIZE utilisé
en 8i.
Il
faut rappeler que la PGA est une zone mémoire privée où les
processus allouent de la mémoire pour les opérations de tris, de hash ou de
merge. De ce fait la zone de PGA est séparée de la SGA (System
Global Area). Une troisième zone de mémoire, la UGA (User
Global Area), maintient l'information sur l'état des sessions et des
curseurs. En mode dédié, les processus allouent la zone UGA dans la PGA alors
qu'en mode partagé la zone UGA est allouée dans la SGA (dans la LARGE POOL plus
exactement).
Le
paramètre PGA_AGGREGATE_TARGET, comme son nom l'indique est un objectif et
non une limite absolue. Cela signifie que suivant la charge la somme de mémoire allouée à la PGA peut
dépasser cette limite. La PGA est allouée à la demande puisque chaque processus
utilisateur crée une zone PGA.
Dans
le version Oracle Database 12c, une nouvelle fonctionnalité a été introduite
avec l’introduction du nouveau paramètre PGA_AGGREGATE_LIMIT qui permet de contrôler
la quantité maximale de la mémoire PGA, consommée par les processus
utilisateurs.
Dans
les versions précédentes, le seul control disponible est le paramètre masqué _pga_max_size, qui pose une limite de
la mémoire utilisée par chaque processus de manière individuelle. La paramètre PGA_AGGREGATE_LIMIT fixe la limite AGREGEE de la PGA totale.
Lorsque
la valeur de PGA_AGGREGATE_LIMIT est en dehors de ses limites, les sessions ou
processus utilisant la mémoire PGA la plus élevée sont résiliées et l’erreur
suivante est écrite dans le fichier des alertes :
PGA memory used by the instance exceeds
PGA_AGGREGATE_LIMIT of 3072 MB
Immediate
Kill Session#: 41, Serial#: 397
Immediate
Kill Session: sess: 0xc13a5066 OS pid: 5233
Le
paramètre PGA_AGGREGATE_LIMIT est dynamique et sa valeur peut être changée base
ouverte. La base de données n’a donc pas besoin d’être redémarrée :
SQL> alter system set
pga_aggregate_limit=60G scope=both;
System
Altered.
Notez
toute fois que vous ne pouvez pas réduire la valeur de PGA_AGRREGATE_LIMIT indéfiniment,
selon la configuration de votre base de données. Si cette valeur est trop
faible, vous recevez l’erreur suivante :
Le paramètre PGA
SQL> alter system set
pga_aggregate_limit=100M scope=both;
alter system set pga_aggregate_limit=100M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified specified value invalid
ORA-00093: pga_aggregate_limit must be between 1694M and 100000G
Pour
les DBA (Database Administrator), il est important d’être informe du
comportement de ce nouveau paramètre. Si vous travaillez dans une base de données
Oracle 12c et qu’une session se termine brutalement, vous devriez regarder si
ce n’est pas l’effet de ce paramètre.
Merci
à vous et je reste ouvert à toute remarque constructive.