Memoptimized Rowstore - Oracle Database 18c

Por Francisco Riccio.
Publicado en Abril 2018



Introducción


Memoptimized Rowstore es una nueva funcionalidad disponible en Oracle Database 18c y nos permite obtener máximo desempeño en aquellas consultas que filtran por el primary key de la tabla de manera frecuente. A partir de esta nueva funcionalidad, se proyecta una reducción en el tiempo de ejecución de estas consultas SQL en un 50% aproximadamente.

Para ello, Oracle ha creado un nuevo pool de memoria en el SGA llamado memoptimize y por defecto está configurado a 0 bytes, teniendo como requisito mínimo 100 MB en caso se desee habilitar esta funcionalidad. Este nuevo pool, almacenará un hash index basado en el primary key de cada tabla y los bloques de la tabla serán alojados en el Buffer Cache.

Las tablas a habilitar con esta nueva opción deberán cumplir con los siguientes requisitos:

  • No tener habilitado la opción de compresión.
  • Deben tener un constraint de tipo primary key.

Una vez habilitado esta opción en las tablas que deseemos, cualquier consulta basado en el primary key y únicamente utilizando el operador de igualdad, utilizará el feature Fast Lookup que permitirá al optimizador de la base de datos primero consultar el hash index para luego ir directamente al bloque de datos que se encuentra en el Buffer Cache con la finalidad de evitar el acceso a disco.



Implementación


Se creará una tabla llamada Producto con su primary key para luego insertar 1 millón de registros. Posterior a ello se realizará la implementación y pruebas de la nueva funcionalidad.


A. Habilitación del Feature

Se deberá modificar el parámetro MEMOPTIMIZE_POOL_SIZE. Para la implementación se asignará 256 MB de memoria RAM. Recordemos que este pool mantiene en memoria un arreglo hash basado en los valores del campo de la primary key de una tabla específica.


B. Poblar el Hash Index

Para poblar el hash index primero se debe configurar la tabla con la opción MEMOPTIMIZE FOR READ y posteriormente ejecutar el paquete DBMS_MEMOPTIMIZE.

En caso se desee trabajar únicamente con la partición de una tabla, se deberá ingresar el nombre de este como tercer parámetro en el procedimiento DBMS_MEMOPTIMIZE.POPULATE.

Es posible habilitar la opción MEMOPTIMIZE FOR READ desde la creación de la tabla como a continuación se presenta:

Si deseamos deshabilitar el feature en la tabla, ejecutamos el siguiente comando:

También se puede eliminar el Hash Index a través del siguiente procedimiento DBMS_MEMOPTIMIZE.DROP_OBJECT.

El paquete DBMS_MEMOPTIMIZE se encuentra en el siguiente script: $ORACLE_HOME/rdbms/admin/dbmsmemoptimize.sql y por efecto viene instalado en la base de datos.



C. Revisión de Planes de Ejecución

Una vez ejecutado los pasos de implementación, se procederá a realizar una consulta sobre la tabla Producto, filtrando por el campo cod (primary key) y utilizando el operador “=”.

Se aprecia que el plan de ejecución cuenta con 2 nuevas operaciones: INDEX UNIQUE SCAN READ OPTIM y TABLE ACCESS BY INDEX ROWID READ OPTIM y se evidencia que primero es consultado el Hash Index y luego la Tabla para acceder al registro solicitado por la consulta SQL.


A continuación se realizará algunas consultas SQL donde se apreciará que el Buffer MemOptimized no será tomado en cuenta al no cumplir las condiciones previamente especificadas:

Caso #1:

Al utilizar un operador distinto al “=” genera que no se utilice el nuevo pool.


Caso #2:

Este caso a pesar de utilizar el operador “=” no utiliza el nuevo pool al filtrar por más de un valor.


Caso #3:

El nuevo pool no será utilizado debido a que el filtro se lleva por un campo adicional al primary key.



Conclusión


Esta nueva funcionalidad permite obtener alto desempeño en el tiempo de respuesta de las aplicaciones que buscan consultar datos filtrados por el primary key de una tabla mediante un operador de igualdad; donde este tipo de comportamiento es usual en soluciones de IoT (Internet de las Cosas).

La propuesta entregada de MemOptimize es muy beneficiosa pero a la vez se debe tener presente las reglas que deben cumplirse para que el optimizador de la base de datos pueda tomar ventaja de ello y por ende nuestras aplicaciones.



Francisco Riccio, actualmente se desempeña como Arquitecto de Soluciones en Oracle Perú y es instructor de cursos oficiales de certificación Oracle. Es un Oracle Certified Professional en productos de Oracle Application, Base de Datos, Cloud & Virtualización.

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.