[ 2018-05-13 ]

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

Artículo publicado en Oracle Technology Network (OTN) en español -  mayo de 2018 


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

No hay comentarios:

Publicar un comentario