Oracle Database 18c: Utilizando Memoptimized Rowstore (Parte I)

Por Sebastián D’Alessandro
Publicado en Mayo 2018

Revisado por Lorenzo Mota



Introducción


En lo que a performance se refiere, uno de los new features más importantes de Oracle Database 18c, es Memoptimized Rowstore. Esta nueva funcionalidad provee una mejora notable en el rendimiento de aplicaciones que, cuando realizan consultas a la base de datos, acceden frecuentemente a tablas utilizando columnas con clave primaria, por ejemplo las aplicaciones del tipo “Internet of Things” (IoT),

La funcionalidad Memoptimized Rowstore posibilita la capacidad de fast lookup de datos sobre este tipo de tablas cuando se realizan esas consultas. Para ello, Oracle utiliza una nueva área de memoria SGA (System Global Area) llamada memoptimize pool,  la cual almacena índices tipo hash para las tablas que tienen habilitada la opción de fast lookup. Un hash index es una estructura interna que es mantenida en este nuevo pool, e indexa áreas de memoria para el acceso a través de claves primarias.

En esta primera parte del artículo, veremos de qué se trata esta nueva estructura de memoria y cómo podemos configurarla para posteriormente utilizarla. En la segunda, profundizaremos en detalle cómo utilizar la funcionalidad de Memoptimized Rowstore.


Memoptimize Pool:  una nueva área de memoria en la SGA

Al igual que ocurre con el In-Memory Column Store, el memoptimize pool es una subarea de memoria en la SGA que tiene como objetivo aportar funcionalidades para la mejora de rendimiento en la ejecución de consultas SQL.

Cuando una tabla del tipo heap-organized (el tipo de tabla default en bases de datos Oracle)  es definida como MEMOPTIMIZE FOR READ, este nuevo pool almacena buffers y estructuras relacionadas que permiten un acceso optimizado a esa tabla.

Esta estructura de memoria, le proporciona un excelente rendimiento y escalabilidad a consultas basadas en clave primaria. Para reducir el tiempo de respuesta “end-to-end”, los clientes extraen los búferes solicitados directamente desde la SGA a través de la red, evitando de esta manera el consumo de CPU y sobrecarga del sistema operativo en general. Por otro lado, las aplicaciones pueden beneficiarse del memoptimize pool sin necesitar cambios en su código.

El memoptimize pool está formado principalmente por dos componentes:

• Buffer Area

Para evitar operaciones de E/S a disco, la base de datos sube y bloquea permanentemente en el memoptimize pool los buffers de tablas indicadas con la opción MEMOPTIMIZE FOR READ. Este comportamiento se mantendrá así hasta que la tabla se marque como NO MEMOPTIMIZE FOR READ. Los buffers en este pool, utilizan una estructura similar a los buffers en el data buffer cache de la base de datos, pero están separados de éste y no cuentan como parte del mismo. En el memoptimize pool, el área de buffer ocupa el 75% del tamaño.


• Hash Index

Un hash index es una estructura “no persistente” de segmento de datos. La base de datos asigna el índice de tipo hash como unidades de memoria múltiples y no contiguas. Cada unidad contiene una cantidad determinada de “hash buckets”. Una estructura de mapa separada, correlaciona una unidad de memoria con una clave principal. El  hash index ocupa el 25% del memoptimize pool.

Cuando la instancia es iniciada, estas estructuras son asignadas en la SGA.

En la figura 1, podemos ver un esquema de la arquitectura del Memoptimize Pool.


Figura 1


Luego de la creación de una nueva base de datos, el memoptimize pool  se encuentra deshabilitado por defecto, debemos entonces configurarlo para poder utilizar esta nueva característica. Simplemente debemos establecer el parámetro de inicio MEMOPTIMIZE_POOL_SIZE en un valor entero distinto de 0, indicando de esta manera la cantidad de memoria SGA que queremos destinar a este pool. El valor mínimo que puede asignarse es de 100M.

La cantidad de memoria  especificada por este parámetro es tomada de la memoria configurada en  SGA_TARGET, por lo tanto hay que analizar bien la necesidad y el  impacto en el momento de la configuración.  Por ejemplo, si se establece SGA_TARGET en 50 GB y MEMOPTIMIZE_POOL_SIZE en 5 GB, el 10% de la memoria asignada a la SGA será para el memoptimize pool.

A diferencia de otros componentes de SGA, como por ejemplo el data buffer cache o el shared pool, el tamaño del memoptimize pool  no está controlado por AMM (Automatic Memory Management). La base de datos no reduce automáticamente el  memoptimize pool cuando el buffer cache o shared pool requieren  más memoria, o aumenta su tamaño cuando se queda sin espacio.

El control de tamaño del  memoptimize pool sólo puede realizarse  ajustando manualmente el parámetro de inicialización MEMOPTIMIZE_POOL_SIZE. Si bien el valor del parámetro es contabilizado dentro del valor para SGA_TARGET no hay una gestión automática del tamaño del memoptimize pool, debe hacerse de manera manual y no puede realizarse de forma dinámica.

En la siguiente tabla (tabla 1) podemos observar las características del parámetro  MEMOPTIMIZE_POOL_SIZE.

Propiedad

Descripción

Tipo de parámetro

Big integer

Sintaxis

MEMOPTIMIZE_POOL_SIZE = integer [K | M | G]

Valor default

0

Modificable

No

Modificable a nivel PDB

No

Rango de valores

0 to no máximum

Básico

No

Oracle RAC

Pueden utilizarse valores diferentes por instancias

Tabla 1


Para habilitar el pool necesitamos cumplir básicamente con dos requisitos:

  1. La base se encuentre en modo “open
  2. El parámetro COMPATIBLE está establecido en 18.0.0 o superior

En la imagen de abajo (figura 2), podemos ver la salida del control de requisitos.


Figura 2



Pasos para la habilitación:

  1. Nos conectamos con un usuario privilegiado vía SQL*Plus
    
    [oracle@ol6 ~]$ sqlplus / as sysdba
    
    SQL*Plus: Release 18.0.0.0.0 Production on Wed Mar 7 17:11:24 2018
    Version 18.1.0.0.0
    
    Copyright (c) 1982, 2017, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
    Version 18.1.0.0.0
    
    SQL>
    


  2. Modificamos el parámetro “memoptimize_pool_size”

    El parámetro debe establecerse en un valor distinto de 0, teniendo en cuenta que el valor mínimo es 100M.
    Como vimos, el parámetro no es dinámico con lo cual será necesario modificarlo en SPFILE y luego reiniciar la instancia.

    
    SQL> alter system set memoptimize_pool_size=100m scope=spfile;
    
    System altered.


    Si verificamos luego de ejecutar la sentencia anterior, veremos que el valor permanece en 0. Esto será así hasta que se reinicie la instancia.

    SQL> show parameter memoptimize_pool_size
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -----------------------------
    memoptimize_pool_size                big integer 0
    


  3. Reiniciamos la instancia:
    
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  947910736 bytes
    Fixed Size                  8902736 bytes
    Variable Size             427819008 bytes
    Database Buffers          507510784 bytes
    Redo Buffers                3678208 bytes
    Database mounted.
    Database opened.
    


  4. Verificamos nuevamente. Ahora si podemos comprobar que el parámetro está configurado con el valor indicado.
    
    SQL> show parameter memoptimize_pool_size
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -----------------------------
    memoptimize_pool_size                big integer 100M
    

    El área de memoria para Memoptimized Rowstore ya está configurada y lista para ser utilizada.




Conclusión:


En esta primera parte del artículo, vimos como configurar la memoria de la instancia para utilizar la nueva funcionalidad Memoptimized Rowstore en de Oracle Database 18c. Esta estructura de memoria se llama Memoptimized Pool.

En la segunda parte de este artículo veremos cómo utilizar la funcionalidad definiendo tablas con la opción MEMOPTIMIZE FOR READ.



Sebastián D'Alessandro es un Senior DBA con más de 15 años de experiencia real trabajando con tecnología Oracle. Focaliza su actividad principalmente en la administración de base de datos, diseño de soluciones de alta disponibilidad y disaster recovery, análisis de performance, seguridad y virtualización. Actualmente desarrolla su actividad en el área de base de datos de una importante empresa multinacional proveedora de servicios de seguridad. Sebastián, también participa como orador en distintos eventos de tecnología y frecuentemente publica en su blog personal http://sdalessandro.blogspot.com. Puedes seguirlo también en Twitter: https://twitter.com/sebdalessandro

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.