El Database Buffer Cache en Oracle 19c es una parte crucial de la arquitectura de la base de datos, cuyo objetivo principal es almacenar los bloques de datos que han sido leídos de la base de datos en disco.

Aquí te explico en detalle qué es, su función y cómo opera:

¿Qué es el Buffer Cache?

El Buffer Cache es un área de memoria dentro del SGA (System Global Area) que guarda copias en memoria de los bloques de datos de las tablas y los índices de la base de datos. Cuando se ejecuta una consulta o se modifica datos, Oracle primero verifica si el bloque de datos requerido ya se encuentra en el Buffer Cache.

Funciones del Buffer Cache

  1. Reducción de E/S de Disco:
    • Cuando se necesita acceder a un bloque de datos, Oracle primero verifica el Buffer Cache. Si el bloque está presente (esto se llama un «cache hit»), se puede acceder rápidamente desde la memoria, evitando la necesidad de realizar una operación de lectura costosa desde el disco.
  2. Mejora del Rendimiento:
    • Al almacenar los bloques de datos en memoria, el Buffer Cache mejora el rendimiento general de la base de datos al reducir el tiempo de respuesta para las consultas y operaciones de modificación.
  3. Escrituras en Disco:
    • Cuando los datos en el Buffer Cache se modifican, estos no se escriben inmediatamente en el disco. En su lugar, Oracle utiliza un mecanismo llamado «decoupled writes» para escribir los datos en disco en un momento posterior, optimizando así el rendimiento.
  4. Manejo de la Consistencia:
    • El Buffer Cache también ayuda a mantener la consistencia de los datos. Oracle utiliza técnicas como el uso de redo logs para garantizar que las modificaciones se registren y se puedan recuperar en caso de fallos.

Componentes del Buffer Cache

El Buffer Cache se divide en varias partes, que incluyen:

  • Least Recently Used (LRU): Los bloques en el Buffer Cache se gestionan mediante un algoritmo LRU para asegurar que los bloques más utilizados permanezcan en memoria y que los menos utilizados sean desalojados cuando se necesite espacio.
  • Dirty Buffers: Son los bloques que han sido modificados en el Buffer Cache pero que aún no se han escrito de nuevo en el disco. Estas modificaciones se registran en los redo logs.
  • Clean Buffers: Son los bloques que están en el Buffer Cache y coinciden con lo que hay en disco. Estos bloque pueden ser eliminados si Oracle necesita liberar espacio.

Tamaño del Buffer Cache

El tamaño del Buffer Cache se configura con el parámetro DB_CACHE_SIZE. Su tamaño debe ajustarse según las necesidades de la aplicación y el hardware, basándose en un análisis de rendimiento.

Monitoreo y Ajuste

Se recomienda monitorear el uso del Buffer Cache utilizando vistas del diccionario de datos como V$DB_CACHE_ADVICE y V$DB_BLOCK_CHECKSUM, etc. para evaluar su eficacia y realizar ajustes si es necesario. También puedes observar métricas como el cache hit ratio, que indica el porcentaje de accesos a bloques que se encontraron en el Buffer Cache.

V$SGASTAT: Proporciona información sobre el uso de la memoria de la SGA, incluido el buffer cache.

SELECT * FROM V$SGASTAT WHERE NAME = 'db cache size';

V$BUFFER_POOL_STATISTICS: Ofrece estadísticas sobre el uso del buffer cache, incluyendo la cantidad de bloques leídos y escritos.

SELECT * FROM V$BUFFER_POOL_STATISTICS;

V$BUFFER_POOL_STATISTICS: Ofrece estadísticas sobre el uso del buffer cache, incluyendo la cantidad de bloques leídos y escritos.

SELECT * FROM V$BUFFER_POOL_STATISTICS;

V$DB_CACHE_ADVICE: Proporciona recomendaciones sobre el tamaño óptimo del buffer cache basado en el análisis de la carga de trabajo actual.

SET LONG 200;
SELECT * FROM V$DB_CACHE_ADVICE;

El «buffer cache hit ratio» es una métrica clave que indica la eficiencia del buffer cache. Un ratio alto significa que la mayoría de las solicitudes de acceso a datos se satisfacen directamente desde el buffer cache, en lugar de requerir una lectura del disco.

Para calcular el ratio de hit, puedes usar la siguiente consulta:

SELECT
(SUM(phyrd) - SUM(pbhit)) / SUM(phyrd) AS "Hit Ratio"
FROM v$Buffer_pool_statistics;

Un valor de hit ratio cercano al 100% es ideal, pero dependiendo de la carga de trabajo, un 90% o superior suele ser aceptable.

Modificar el Tamaño

Dependiendo de las métricas que hayas recopilado, considera aumentar o disminuir el tamaño del DB_CACHE_SIZE.

  • Si el Hit Ratio es bajo: Podrías considerar aumentar el tamaño del buffer cache. Esto puede ayudar a reducir las lecturas desde el disco, aumentando la eficiencia.
  • Si hay suficiente memoria disponible: Incrementar el buffer puede ser beneficioso.
  • Si hay competencia por la memoria: Si el sistema está utilizando demasiada memoria, reduce el tamaño del buffer cache para liberar recursos.

Ajuste

SPFILE

ALTER SYSTEM SET DB_CACHE_SIZE = 800M SCOPE=BOTH;

PFILE

    Abre el archivo de inicialización de tu base de datos (init.ora) y localiza la línea con db_cache_size.

    Si no existe, agrégala. Por ejemplo:

    db_cache_size=500M

    Para que los cambios surtan efecto, necesitas reiniciar la base de datos. Primero, cierra y vuelve a iniciar la base de datos:

    SHUTDOWN IMMEDIATE;
    STARTUP;

    Puedes verificar el tamaño del buffer cache con:

    SHOW PARAMETER DB_CACHE_SIZE;

    Es importante elegir un tamaño correcto para el DB_CACHE_SIZE según la carga de trabajo de la base de datos y la memoria RAM del servidor.

    Deja un comentario

    Tendencias