Gestión de memoria para Oracle 10g y >=Oracle 11g

En las versiones 10g y 11g de Oracle Database, se ha simplificado la configuración de las estructuras de memoria tanto para el SGA como el PGA de forma notable.

Oracle versión >=10g

A partir de la versión 10g se introducen 2 nuevos parámetros de gestión de memoria que simplifican enormente esta tarea.

SGA_TARGET, simplemente se fija un valor y redimensiona a demanda los valores (siempre y cuando sean=0):

  • Buffer cache (DB_CACHE_SIZE)
  • Shared pool (SHARED_POOL_SIZE)
  • Large pool (LARGE_POOL_SIZE)
  • Java pool (JAVA_POOL_SIZE)
  • Streams pool (STREAMS_POOL_SIZE)

PGA_AGGREGATE_TARGET, fijamos un valor y son redimensionadas las estructuras relacionadas con el PGA de forma dinámica (siempre y cuando sean=0). Es decir todos los parámetros:

  • SORT_AREA_SIZE
  • BITMAP_MERGE_AREA_SIZE
  • CREATE_BITMAP_AREA_SIZE
  • HASH_AREA_SIZE

Oracle recomienda de forma encarecida usar estos parámetros y olvidarnos de los antiguos, algo que deberíamos llevar a la práctica lo antes posible. He visto aunténticos milagros en mejoras de rendimiento, símplemente usando la gestión de memoria automática.

Una vez dicho esto lo único que tenemos que saber es si el tamaño que tenemos asignado es el que necesita nuestra BD, es decir si no la estamos sobredimensionando o en cambio nos estamos quedando cortos.

Mejoras para el parámetro PGA_AGGREGATE_TARGET:

Source   
SQL> SELECT PGA_TARGET_FOR_ESTIMATE,PGA_TARGET_FACTOR,ESTD_EXTRA_BYTES_RW FROM v$pga_target_advice;
PGA_TARGET_FOR_ESTIMATE PGA_TARGET_FACTOR ESTD_EXTRA_BYTES_RW
----------------------- ----------------- -------------------
22020096              ,125            75026432
44040192               ,25            75026432
88080384                ,5            71868416
132120576               ,75             9814016
176160768                 1                   0
211392512               1,2                   0
246624256               1,4                   0
281857024               1,6                   0
317088768               1,8                   0
352321536                 2                   0
528482304                 3                   0
704643072                 4                   0
1056964608                 6                   0
1409286144                 8                   0

El valor 1 en la columana PGA_TARGET_FACTOR indica el tamaño actual para el parámetro PGA_AGGREGATE_TARGET=176160768 (en bytes). Lo que se ha de buscar es el primer valor de la columna ESTD_EXTRA_BYTES_RW=0, esto indica que el PGA no ha requerido espacio extra en ningún momento.

Si por ejemplo el primer 0 lo encontrásemos en en valor 1.4 de la columna PGA_TARGET_FACTOR, indicaría que el paraḿetro PGA_AGGREGATE_TARGET debería ser 246624256.

Una vez conocido el valor adecuado (siempre que tengamos recursos suficientes), modificamos el valor con (para probar):

Source   
SQL> ALTER system SET PGA_AGGREGATE_TARGET=246624256 scope=memory;

Y para hacer el cambio definitivo (siempre y cuando estemos trabajando con spfile):

Source   
SQL> ALTER system SET PGA_AGGREGATE_TARGET=16777216 scope=spfile;

Mejora para el parámetro SGA_TARGET:

Source   
SELECT SGA_SIZE, SGA_SIZE_FACTOR, ESTD_DB_TIME FROM v$sga_target_advice ORDER BY SGA_SIZE_FACTOR
SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME
---------- --------------- ------------
140               1         3527
175            1,25         3239
210             1,5         3080
245            1,75         2935
280               2         2893

El valor 1 en la columna SGA_SIZE_FACTOR indica el tamaño actual para el parámetro SGA_TARGET=140 (en megas). Lo que se ha de buscar es el primer valor de la columna ESTD_DB_TIME que no se reduzaca más (o la diferencia es muy mequeña)

En el ejemplo podríamos tomar directamente el valor de SGA_SIZE=280, ya que se aprecia reducción en ESTD_DB_TIME.

Una vez conocido el valor adecuado (siempre que tengamos recursos suficientes), modificamos el valor con (para probar):

Source   
SQL> ALTER system SET SGA_TARGET=280M;

Y para hacer el cambio definitivo (siempre y cuando estemos trabajando con spfile):

Source   
SQL> ALTER system SET SGA_TARGET=280M scope=spfile;

Las reducciones del SGA_TARGET se pueden hacer dinámicamente, pero para las ampliaciones seguramente nos econtermos que el parámetro SGA_MAX_SIZE no nos permita crecer más, será necesario para la BD y relializar la modificación con la BD parada.

Hasta aquí es aplicable a las versiones 10g y 11g de Oracle Database.

Oracle versión >=11g

En la versión 11g se ha añadido el parámetro MEMORY_TARGET que todavía simplifica más la gestión de memoria de la instancia. Cuando fijamos este parámetro lo que estamos haciendo es decirle a Oracle que redimensione SGA_TARGET y PGA_AGGREGATE_TARGET a demanda de la aplicación (siempre y cuando no se especifiquen de forma explícita). Es decir que podemos fijar 6Gb para MEMORY_TARGET y nos olvidamos del resto de la gestión de memoria.

Detectar mejora para MEMORY_TARGET:

Source   
SQL> SELECT MEMORY_SIZE,MEMORY_SIZE_FACTOR,ESTD_DB_TIME FROM v$memory_target_advice;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME
----------- ------------------ ------------
308                  1         3563
385               1,25         3767
462                1,5         3538
539               1,75         3508
616                  2         3508

El valor 1 en la columna MEMORY_SIZE_FACTOR indica el tamaño actual para el parámetro MEMORY_TARGET=308 (en megas). Lo que se ha de buscar es el primer valor de la columna ESTD_DB_TIME que no se reduzaca más (o la diferencia es muy mequeña)

En el ejemplo podríamos tomar el valor de MEMORY_SIZE=539, ya que con un valor más alto no se aprecia reducción en ESTD_DB_TIME.

Una vez conocido el valor adecuado (siempre que tengamos recursos suficientes), modificamos el valor con (para probar):

Source   
SQL> ALTER system SET MEMORY_TARGET=539M;

Y para hacer el cambio definitivo (siempre y cuando estemos trabajando con spfile):

Source   
SQL> ALTER system SET MEMORY_TARGET=539M scope=spfile;

Las reducciones del MEMORY_TARGET se pueden hacer dinámicamente, pero para las ampliaciones seguramente nos eNcontermos que el parámetro MEMORY_MAX_TARGET no nos permita crecer más, será necesario para la BD y relializar la modificación con la BD parada.

6 thoughts on “Gestión de memoria para Oracle 10g y >=Oracle 11g

  1. Hola, para la versión 10g, ¿qué pasa si para la PGA no tienes ningún valor 0, sólo un valor que se estabiliza a partir de cierto valor para el PGA_TARGET_FACTOR?

    • Con lo de PGA_TARGET_FACTOR supongo que te refieres al campo de la vista DBA_HIST_PGA_TARGET_ADVICE.

      Lo ideal es asignarle a PGA_AGGREGATE_TARGET el valor del DBA_HIST_PGA_TARGET_ADVICE cuando el valor de ESTD_EXTRA_BYTES_RW es proximo a 0 o 0. Estoy hablando de la consulta:
      select PGA_TARGET_FOR_ESTIMATE,PGA_TARGET_FACTOR,ESTD_EXTRA_BYTES_RW from v$pga_target_advice

      • Si, gracias, a eso me refería, lo que pasa es que los valores que me entregaba la consulta no andaban ni cercanos a cero, pero creo que capté la idea, mi perfil es el desarrollo y en este momento no dispongo de DBA….

    • En este caso estamos lejos de tener un valor configurardo idoneo, lo que está diciendo en que debemos aumentar el PGA_AGGREGATE_TARGET.

Deja un comentario