Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Framework para el Desarrollo "In-Memory Column Store": Cuando solo "In-Memory" no es suficiente
de Aplicaciones Por Flávio Soares (OCE), Joel Pérez & Sebastián D'Alessandro (OCE)
Application Express Publicado en Mayo 2016
Business Intelligence Esta es una serie de artículos dedicados a la nueva funcionalidad “Oracle In-Memory Column Store”, presente en la versión de base de datos Oracle
12c. Oracle lleva muchos años permitiendo la lectura de bloques directamente desde memoria RAM por medio de la utilización del buffer cache
Cloud Computing (v$bh). A lo largo de todos estos años realizó un gran trabajo perfeccionando continuamente el algoritmo LRU que utiliza, con el fin de optimizar las
Communications búsquedas de bloques calientes y poder mantenerlos el mayor tiempo posible en memoria, logrando de esta manera un acceso más rápido y
actuando como un verdadero “cache” para la base de datos.
Rendimiento y Disponibilidad
de Base de datos Con la incorporación de In Memory DB (IMDB), tanto la arquitectura como el rendimiento cambian diametralmente en comparación con el modo de
Data Warehousing lectura tradicional desde el buffer cache en la SGA, esto radica principalmente en la manera que Oracle almacena los datos en memoria. Tal como
su nombre lo indica, Oracle In-Memory Column Store, permite almacenar los datos en memoria de forma columnar, de manera totalmente
.NET optimizada para la lectura vía SDRAM y trabajando así como un verdadero DBMS orientado a columna: Column-oriented DBMS.
Lenguajes de Programación
Dinámicos No es necesario aclarar que el acceso a memoria RAM es más rápido que el acceso a disco (todo el mundo sabe esto), por lo tanto tampoco es
necesario comentar o demostrar las mejoras en materia de rendimiento que acarrea la utilización de IMDB.
Embedded
Surge entonces la pregunta: IMDB llegó para resolver todos los problemas relativos a la performance de un ambiente?
Arquitectura Enterprise
Enterprise Management
Lo que intentaremos mostrar en esta serie de artículos, es justamente la respuesta a esta pregunta. Utilizaremos para ello, casos representativos
con ejemplos y pruebas de la utilización de esta nueva característica que como cualquier otra, presenta ventajas, desventajas y mejores prácticas
Grid Computing en su utilización.
Identidad y Seguridad Es increíble la cantidad de DBAs y empresas que creen en la magia de un “alter table” donde todos los problemas de performance serán resueltos.
Java Pero esto no es así, IMDB de ninguna manera es sinónimo de “desconectar el cerebro del DBA”.
Linux De aquí en adelante, vamos a mostrar y ejemplificar un comportamiento bastante inusual en algunos ambientes con Oracle InMemory.
Service-Oriented Architecture Para esto, a través del utilitario Swingbench crearemos la tabla SOE.ORDER_ITEMS de 12G que será nuestra tabla de pruebas para la utilización
SQL & PL/SQL de IMDB.
1 rowselected.
PL/SQL proceduresuccessfullycompleted.
=============================================
=== O B J E C T T A B L E ===
=============================================
================================================================================
Table Statistics
================================================================================
TABLE_NAME : ORDER_ITEMS
STATUS : VALID
LAST_ANALYZED : 29/03/2016 22:08:46
PARTITIONED : NO
TEMPORARY : N
DEGREE : 1
BUFFER_POOL : DEFAULT
CACHE : NO
CELL_FLASH_CACHE : DEFAULT Chat
COMPRESSION : DISABLED
RESULT_CACHE : DEFAULT
ROW_MOVEMENT : DISABLED
LOGGING : YES
SAMPLE_SIZE : 85789721
===============================================================================================================================
Column Statistics
===============================================================================================================================
ID# NAME ANALYZED NDV DENSITY # NULLS # BUCKETS SAMPLE HISTOGRAM
===============================================================================================================================
1 ORDER_ID 29-03-16 22:08 28434432 0.00000004 0 1 85789721 NONE
2 LINE_ITEM_ID 29-03-16 22:08 5 0.20000000 0 1 85789721 NONE
3 PRODUCT_ID 29-03-16 22:08 999 0.00100100 0 1 85789721 NONE
4 UNIT_PRICE 29-03-16 22:08 2000 0.00050000 0 1 85789721 NONE
5 QUANTITY 29-03-16 22:08 10 0.10000000 0 1 85789721 NONE
6 DISPATCH_DATE 29-03-16 22:08 124 0.00806452 0 1 85789721 NONE
7 RETURN_DATE 29-03-16 22:08 4507 0.00022188 84059125 1 1730596 NONE
8 GIFT_WRAP 29-03-16 22:08 6 0.16666667 0 1 85789721 NONE
9 CONDITION 29-03-16 22:08 3 0.33333333 0 1 85789721 NONE
10 SUPPLIER_ID 29-03-16 22:08 999 0.00100100 0 1 85789721 NONE
https://www.oracle.com/technetwork/es/articles/database-performance/in-memory-column-store-3030245-esa.html 1/5
3/5/2019 "In-Memory Column Store": Cuando solo "In-Memory" no es suficiente
11 ESTIMATED_DELIVERY 29-03-16 22:08 4507 0.00022188 0 1 85789721 NONE
===============================================================================================================================
IndexInformation
================================================================================================================================
INDEX_NAME COLUMNS ANALYZED DIST_KEYS DENSITY NUM_ROWS UNIQUE VISIBLE ST
================================================================================================================================
ITEM_ORDER_IX ORDER_ID 29-03-16 22:08 28434432 0.0000000 82834901 NO YES
ITEM_PRODUCT_IX PRODUCT_ID 29-03-16 22:08 999 0.0010010 79984685 NO NO
ORDER_ITEMS_PK LINE_ITEM_ID ,ORDER_ID 29-03-16 22:08 85615194 0.0000000 85615194 YES YES
sys@ora01 SQL>
Podemos ver que la tabla SOE.ORDER_ITEMS está con la opción “In Memory” deshabilitada:
1 rowselected.
Vamos a ejecutar una consulta sobre la tabla y luego analizar los resultados. Estamos forzando que la consulta sea ejecutada en “serie” y
obteniendo el máximo de estadísticas para el análisis, eso lo logramos utilizando los hints NO_PARALLEL y GATHER_PLAN_STATISTICS
respectivamente.
SUM(QUANTITY)
-------------
1376607
Elapsed: 00:00:43.51
1 rowselected.
SQL MonitoringReport
SQL Text
------------------------------
SELECT /*+ monitor gather_plan_statisticsno_parallel */ SUM(quantity) FROM soe.order_items WHERE product_id=:p
Global Information
------------------------------
Status : DONE (ALL ROWS)
SQL ID : 97h2yq31w3gm6
SQL Execution ID : 16777216
Duration : 44s
Module/Action : SQL*Plus/-
FetchCalls : 1
Binds
=====================================
| Name | Position | Type | Value |
=====================================
| :P | 1 | NUMBER | 509 |
=====================================
Global Stats
================================================================
| Elapsed | Cpu | IO | Fetch | Buffer | Read | Read |
| Time(s) | Time(s) | Waits(s)| Calls | Gets | Reqs | Bytes |
================================================================
| 44 | 4.92 | 39 | 1 | 251K | 250K | 2GB |
================================================================
1 rowselected.
Tenemos aquí el plan de ejecución de nuestra consulta sobre la tabla ORDER_ITEMS. Puede verse que demoró 44s en ser procesada, donde 39s
fueron gastados en I/O y 5s en utilización de CPU. La lectura total a disco fue de alrededor de 2G.
A partir de ahora, iniciaremos nuestra prueba con Oracle In-Memory 12c. El objetivo aquí es colocar nuestra tabla ORDER_ITEMS en modo In-
Memory Column Store y realizar nuevamente la misma consulta, para así poder obtener algunas conclusiones. El primer paso, como dijimos, es
cargar la columna en memoria:
Table altered.
https://www.oracle.com/technetwork/es/articles/database-performance/in-memory-column-store-3030245-esa.html 2/5
3/5/2019 "In-Memory Column Store": Cuando solo "In-Memory" no es suficiente
sys@ora01 SQL> ALTER SESSION SET "_inmemory_populate_wait"=TRUE;
Sessionaltered.
PL/SQL proceduresuccessfullycompleted.
1 rowselected.
Podemos ver en la vista v$im_segments que nuestra tabla está totalmente cargada (“populada”) en el área de memoria de In Memory, con un
tamaño aproximado de 3500M.
Con la tabla ya en memoria, vamos a ejecutar la misma consulta y verificar los resultados. Antes, vamos a hacer un “flush” del buffer cache/shared
pool para que las acciones de la prueba anterior no sean tenidas en consideración.
Systemaltered.
Systemaltered.
sys@ora01 SQL> SELECT /*+ monitor gather_plan_statisticsno_parallel */ SUM(quantity) FROM soe.order_items WHERE product_id=:p;
SUM(QUANTITY)
-------------
1376607
Elapsed: 00:00:43.03
1 rowselected.
SQL MonitoringReport
SQL Text
---------------------------------------
SELECT /*+ monitor gather_plan_statisticsno_parallel */ SUM(quantity) FROM soe.order_items WHERE product_id=:p
Global Information
---------------------------------------
Status : DONE (ALL ROWS)
SQL ID : 97h2yq31w3gm6
SQL Execution ID : 16777216
Duration : 44s
Module/Action : SQL*Plus/-
FetchCalls : 1
Binds
=====================================
| Name | Position | Type | Value |
=====================================
| :P | 1 | NUMBER | 509 |
===================================== Chat
Global Stats
=================================================================
| Elapsed | Cpu | IO | Fetch | Buffer | Read | Read |
| Time(s) | Time(s) | Waits(s) | Calls | Gets | Reqs | Bytes |
=================================================================
| 44 | 4.92 | 39 | 1 | 251K | 250K | 2GB |
=================================================================
https://www.oracle.com/technetwork/es/articles/database-performance/in-memory-column-store-3030245-esa.html 3/5
3/5/2019 "In-Memory Column Store": Cuando solo "In-Memory" no es suficiente
1 rowselected.
Como podemos ver, nada ha cambiado en relación a la primera ejecución. Resulta interesante la siguiente apreciación, con la tabla cargada
totalmente en memoria (vía IMDB) la cantidad de lecturas físicas de la segunda ejecución resultó similar a la primera. El tiempo total insumido
tampoco ha cambiado, fue de aprox. 44s para retornar los datos.
Ahora bien, si la tabla ORDER_ITEMS está ahora totalmente disponible en memoria vía “InMemory Column Store”, ¿porque Oracle termina
haciendo la misma cantidad de lecturas a disco?. No debería buscar los datos en memoria y evitar esa gran cantidad de lecturas fisicas?
Como regla general (de igual manera ocurre en SmartScan de Exadata) para que el optimizador decida utilizar InMemory debe existir un acceso
“FULL SCAN” sobre la tabla. Observando el plan de ejecución de la consulta, vemos que en este caso el camino escogido por Oracle es utilizar
INDEX ITEM_PRODUCT_IX (vía INDEX RANGE SCAN).
================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Read | R
| | | | (Estim) | | Active(s)| Active | | (Actual)| Reqs | B
================================================================================================================================
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED | ORDER_ITEMS | 85876 | 697 | 40 | +1 | 1 | 306K | 249K |
| 3 | INDEX RANGE SCAN | ITEM_PRODUCT_IX | 85876 | 2 | 39 | +2 | 1 | 306K | 643
El Whitepaper de Oracle Database In-Memory 12c es muy claro en cuanto a esta cuestión, aclara que una recuperación de datos será realizada
utilizando In-memory solo cuando el acceso a la tabla sea vía FULL SCAN. De esta manera, nuestra consulta jamás accederá a los bloques
presentes en la
Podemos resolver esta situación agregando un hint FULL a la consulta o dejando el índice ITEM_PRODUCT invisible. Veamos el resultado:
Indexaltered.
SUM(QUANTITY)
-------------
1376607
Elapsed: 00:00:00.05
1 rowselected.
SQL MonitoringReport
SQL Text
------------------------------
SELECT /*+ MONITOR GATHER_PLAN_STATISTICS NO_PARALLEL */ sum(QUANTITY) fromsoe.order_itemswhere PRODUCT_ID=:p
Global Information
----------------------------------------
Status : DONE (ALL ROWS)
Instance ID : 1
Session : SYS (1150:44245)
SQL ID : 97h2yq31w3gm6
SQL Execution ID : 16777217
Duration : .041563s
Module/Action : SQL*Plus/-
Service : SYS$USERS
Program : sqlplus@Flavios-MacBook-Pro.local (TNS V1-V3)
FetchCalls : 1
Binds
=====================================
| Name | Position | Type | Value |
=====================================
| :P | 1 | NUMBER | 509 |
=====================================
Global Stats
============================================================================
| Elapsed | Cpu | IO | Other | Fetch | Buffer | Read | Read |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Calls | Gets | Reqs | Bytes |
============================================================================
| 0.04 | 0.04 | 0.00 | 0.00 | 1 | 249 | 18 | 144KB |
============================================================================
1 rowselected.
sys@ora01 SQL>
Ahora si podemos percibir el verdadero poder de INMEMORY. Observe el tiempo de ejecución, bajo de 44s a solo 0.4s. Vemos también que la
operación de acceso no es más por indice(INDEX RANGE SCAN) y ahora si esvía TABLE ACCESSINMEMORY FULL, lo que muestra que la
recuperación de los datos para la tabla ORDER_ITEMS fue realizada exclusivamente desde memoria. Otro punto importante es la cantidad de
lecturas físicas que de 2G cayó a 144kb. El tiempo utilizado de 0.4s fue exclusivamente tiempo de CPU en procesar los datos (CPU Time(s)).
Vamos a mejorar el rendimiento colocando todas nuestras tablas en IMDB? No existe otro camino que probar. Cada ambiente es único y existen
múltiples variables en el medio del camino. Como en las pruebas que realizamos, aun activando IMDB, no notamos mejora alguna hasta que
analizamos y corregimos.
Por qué Oracle decide un acceso utilizando un índice (vía INDEX), siendo que mis datos están en memoria? Bueno, eso será explicado en
profundidad en próximos artículos, pero básicamente Oracle considera que el costo del uso de un índice es menor, por eso termina optando por la
https://www.oracle.com/technetwork/es/articles/database-performance/in-memory-column-store-3030245-esa.html 4/5
3/5/2019 "In-Memory Column Store": Cuando solo "In-Memory" no es suficiente
utilización de INDEX. Existen algunos parámetros de la base de datos que influyen también sobre esta decisión pero vamos a tratar eso en
profundidad luego.
Si IMDB solo funciona en presencia de un acceso vía FULL SCAN, debo dejar todos mis índices invisibles?NUNCA!!! Eso es un mito que surgió con
Exadata, el índice no es un enemigo!. Un acceso vía índice puede ser muchas veces más beneficioso , ya que el objetivo del índice es justamente
economizar lecturas sobre el disco. TI es un mundo lógico y debe ser siempre abordado, con una aproximación sistemática (sysematic aproach). No
existe magia. En futuros artículos vamos a profundizar mejor sobre este tema.
Vamos a necesitar modificar nuestras aplicaciones para utilizar IMDB? Como deja bien claro la documentación de Oracle, no es necesario tocar ni
una coma en la aplicación para utilizar IMDB. Ahora nos hacemos otra pregunta: Vamos a tener rendimiento en todas las tablas que fueron subidas
a INMEMORY? De nuevo .. Depende, es necesario probar para obtener la respuesta.
IMDB mejora realmente el rendimiento? Sí, es extremadamente beneficioso en performance comparado con todo lo disponible en el mercado. Como
dijimos en el comienzo del artículo, no es necesario explicar la enorme diferencia de velocidad entre el acceso a memoria RAM en contraposición
con el acceso a disco. Todos ya lo sabemos. Pero si, es necesario por otro lado, entender cómo aprovechar los beneficios de esta caracteristica de
la mejor forma. Como pudimos ver con un simple ejemplo, una consulta de prueba cayó de 44s a 0,4s y lo más importante sin modificar ni una coma
en la consulta.
Mi aplicación OLTP está repleta de índices, voy a tener alguna ganancia con IMDB? Probablemente. Pero de nuevo: es necesario “probar”. Siempre
se debe evaluar estadísticas, índices, hints, etc.
En próximos artículos trataremos muchas más cosas interesantes sobre esta nueva funcionalidad de Oracle.
Hasta la próxima.
Flavio Soares es un senior DBA Oracle, solucionador de problemas y Consultor Oracle Certificado como OCP/OCE RAC. Especialista en Exadata,
alta disponibilidad y replicación de datos con diversas soluciones Oracle. Flavio ofrece información frecuente para la comunidad de Oracle a través
de sus artículos a través de OTN Portugués.
Joel Pérez es un experto DBA (Oracle ACE Director, OCM Cloud Admin. & OCM11g) con más de 15 años de experiencia real en el mundo de
tecnología Oracle, especializado en diseño e implementación de soluciones de: Cloud, Alta disponibilidad, Recuperación contra desastres,
Upgrades, Replicación y toda área relacionada con bases de datos Oracle. Consultor Internacional con trabajos, conferencias y actividades
relacionadas en más de 50 países alrededor del mundo. Habitual Orador en eventos Oracle alrededor del mundo como: OTN LAD, OTN MENA,
OTN APAC y más. Joel se ha caracterizado siempre por ser un pionero en materia de tecnología Oracle desde los inicios de su carrera siendo el
primer latinoamericano en ser nombrado "OTN Expert" en el año 2003, uno de los primeros Oracle ACE en el programa ACE en el año 2004, unos
de los primeros OCP Cloud en el mercado global en el año 2013 y como uno de los mayores logros de su carrera, recientemente en el 2014 fue
honorificado como uno de los primeros "OCM Database Cloud Administrator" del mundo. En la actualidad Joel Pérez esta radicado en el continente
de Asia con base en Beijing, China llevando a cabo operaciones profesionales como "ChiefTechnologist& MAA, HA Arquitect" para YunheEnmo
(Beijing) Technology Co. Ltd.
Perfil OCM Joel Pérez: http://education.oracle.com/education/otn/JoelPerez.htmp>
Sebastián D'Alessandro es un Senior DBA con más de 12 años de experiencia en tecnología Oracle, focalizado principalmente en seguridad de
base de datos, soluciones de alta disponibilidad, disaster recovery y virtualización. Actualmente desarrolla su actividad como consultor e instructor
de manera independiente.
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.
© Oracle Mapa del sitio Términos de uso y privacidad Preferencias para cookies Opciones de publicidad
Chat
https://www.oracle.com/technetwork/es/articles/database-performance/in-memory-column-store-3030245-esa.html 5/5