Oracle Database 12c: In-Memory (Parte I)

Por Joel Perez , Mahir M. Quluzade (OCE) & Flávio Soares (OCE)
Postado em Julho 2015

Banco de dados In-Memory é uma nova e poderosa feature do banco de dados Oracle que vem no o Oracle Database 12 Release 1 (12.1.0.2) publicado em Julho de 2014. Esta série de artigos cobre esta surpreendente característica de banco de dados Oracle.

Introdução
Normalmente utilizamos dados analíticos (analytics) de sistemas Data Warehouses (DWH) armazenados em dados de sistemas Online Transactional Processing (OLTP). Consultas analytics, são queriescomplexas que trabalham em tabelas muito grandes do DWH. Mas DWHs não são processados em tempo real como os sistemas sistemas OLTP. O Banco de Dados Oracle In-Memory (IM) pode ajudar a executar essas consultas de análises e relatórios complexas tanto em banco de dados OLTP como DWH, suportando assim banco de dados de carga mistas.

Database Block
Oracle Database armazena o dado em formato de linha, assim um registro é armazenado em várias colunas em blocos de dados no disco (Figura 1). Em um banco de dados que trabalha com formato de linha, cada nova transação o registro é armazenado como uma nova linha na tabela. O formato de linha é um formato ideal para bancos de dados OLTP, pois permite acesso rápido a todas as colunas em um registro, já que todos os dados para um determinado registro são mantidos juntos na memória e em disco, também incrivelmente eficiente para o processamento DML.
Description: DataBlock.png
Figure 1: Data Block e o Row Piece format
Essa arquitetura não mudou no ultimo release, a mudança é somente a nível de arquitetura da memória o que significa que a mudança acontece somente para a instância.

Mudança da Instância.

Uma Instância Oracle contém memória e conjunto de processos em background. A memória é dividida em duas áreas distintas: System Global Area (SGA) e Program Global Area (PGA). O Oracle cria processos servidores para lidar com os pedidos de processamento dos usuários conectados à instancia. Uma das mais importantes tarefas do Processo Servidor: ler blocos de dados de objetos a partir de datafile dentro de um buffer do banco de dados que por padrão, armazena os dados no buffer cache do banco de dados Oracle em formato de linha. A partir do 12c o Oracle Database Release 1 (12.1.0.2) adicionou um nova área opcional na SGA chamado de In-Memory, que são objetos armazenados com o novo formatoIn-Memory Coluna Store (IM column store).IM Column storeé opcional e armazena cópias das tabelas, partitions, colunas, materialized views (objetos especificados como INMEMORY usando DDL) em um formato especial de colunas otimizadas para leituras rápidas.
O banco de dados utiliza técnicas especiais, incluindo SIMD processamento de vetor, para varrer dados colunares rapidamente.  A IM column store é um suplemento em vez de ser um substituto para o cache de buffer do banco de dados. A IM column store não substitui o buffer cache. Mas ambas as áreas de memória pode armazenar os mesmos dados em formatos diferentes (Figura 2) e não é necessário para objetos ocupados naIM column store serem carregados no buffer cache do banco de dados, ou seja, os objetos sãoocupados unicamente na IM column store.
Description: Figure 2 -MemoryDualFormat.png
Figura 2: Os dois formatos de armazenamento na memória.

Habilitando o In-Memory Column Store

A partir do Oracle Database 12c Release 1 (12.1.0.2), seis novos parâmetros de inicialização foram adicionados para controlar a funcionalidade do In-Memory, esses parâmetros começam com o prefixo INMEMORY_ (Lista de Código 1). Onovo parâmetro de inicialização OPTIMIZER_INMEMORY_AWAREpode ativar ou desativar todos os aprimoramentos do otimizador para o in-memory. O valor padrão é TRUE. Definir o parâmetro para FALSE, faz com que o otimizador passe a ignorar a propriedade in-memory das tabelas durante a otimização de instruções SQL.
Listade código 1: Parâmetros de Inicialização para o In-Memory
SQL> show parameter inmemory

NAME                                          TYPE          VALUE
--------------------------------------------- ------------  --------
inmemory_clause_default                       string       
inmemory_force                                string        DEFAULT
inmemory_max_populate_servers                 integer       1
inmemory_query                                string        ENABLE
inmemory_size                                 big integer   0
inmemory_trickle_repopulate_servers_percent   integer       1
optimizer_inmemory_aware                      boolean       TRUE
   

INMEMORY_SIZE define o tamanho da In-Memory Column Store (IM columnstore) em uma instância do banco de dados eo valor padrão é 0, o que significa que a IM columnstorenão é utilizada, assim orecurso In-Memory não vem habilitado automaticamente. Precisamos mudar o parâmetro de inicialização INMEMORY_SIZE para um valor diferente de zero para habilitar o IM Columnstore. Se você quer que estaquantidade não tire dado tamanho SGA atual, então você deve estender o tamanho SGA para contabilizar o valor do parâmetro INMEMORY_SIZE. Então, se você estiver usando o Gerenciamento automático de memória (AMM), você precisará estender o valor do parâmetro da MEMORY_TARGET ou se você estiver usando o Shared Memory Management Automatic (ASMM), você vai precisar para estender o valor do parâmetro SGA_TARGET.

No meu caso, estou utilizando o AMM com o memory maximum target para 1024MB e definindo o parâmetro INMEMORY_SIZE para 300MB (Lista de Código 2).

Lista de Código 2: Habilitando o In-Memory

SQL> alter system set  memory_max_target=1324M scope=spfile;
System altered.
SQL>alter system set  inmemory_size=300M scope=spfile;
System altered.
SQL>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1392508928 bytes
Fixed Size               2924304 bytes
Variable Size            1040187632  bytes
Database Buffers         16777216 bytes
Redo Buffers             13852672 bytes
In-Memory Area           318767104 bytes
Database mounted.
Database opened.
 SQL> alter system set  memory_target=1324M;
System altered.
SQL> select * from v$sga;
NAME                 VALUE     CON_ID
-------------------- ---------- ----------
Fixed Size           2924304    0
Variable Size        939524336  0
Database Buffers     117440512  0
Redo Buffers         13852672   0
In-Memory Area       318767104  0

 

Ocupação do In-Memory
Somente objetos específicos com o atributo DDL INMEMORY são populados dentro da IM Column Store.


Figura 3: Cláusula INMEMORY

Você pode definir a clausula INMEMORY para específicos grupos de colunas, para tabelas inteiras, materialized views ou tabelas particionadas.(Lista de Código 3).

Lista de código 3: IM Column Store para tabelas e Materialized Views

SQL> conn inmem01/inmem01
Connected.
   
 
SQL> create table TBIM1 (id number, d date) INMEMORY; 
Table created.
SQL> create table TB1 as select level as id from dual connect by  level<=1e6;
Table created.
SQL> create materialized view MVIM_TB1 INMEMORY as    
2 select * from tb1;
Materialized view created.
SQL> select table_name, inmemory from user_tables;
TABLE_NAME           INMEMORY
------------------   ----------------
TBIM1                ENABLED
TB1                  DISABLED
MVIM_TB1             ENABLED

 

Esperamos que este artigo tenha sido útil para você. Convidamos a ler a próxima parte desta série de artigos:
Oracle Database 12c: In-Memory (Parte II)
 


Joel Pérez é um DBA Especialista (Oracle ACE Director, OCM Cloud Admin. & OCM11g ). Com mais de 14 anos de experiência do mundo Oracle Technology, especializado em arquitetura e implementação de soluções como: Cloud, Alta disponibilidade, Disaster/Recovery, Upgrades, replicação e todos as áreas relacionadas com bancos de dados Oracle. Consultor Internacional realizando conferências em mais de 50 países e inúmeros clientes em todo o mundo. Um dos principais escritores de artigos da Technical Oracle: OTN Espanhol e Português OTN. Regular Speaker nos eventos Oracle em todo o mundo como: OTN LAD, OTN MENA, OTN APAC e muito mais. Joel sempre foi conhecida por ser pioneiro em tecnologia Oracle desde os primeiros dias de sua carreira sendo o primeiro latino-americano premiado como "OTN Expert" no ano de 2003 pela Oracle Corporation, um dos primeiros "ACE Oracle" no Oracle ACE Program no ano de 2004, um dos primeiros OCP Database Cloud Administrator em todo o mundo no ano de 2013 e como um das maiores realizações profissionais em sua carreira, recentemente ele foi homenageado como o primeiro "OCM Database Cloud Administrator" do mundo. Joel Pérez’s OCM Profile: education.oracle.com/education/otn/JoelPerez.htm

Mahir M. Quluzade é um DBA Sênior com mais de 10 anos de experiência em banco de dados Oracle com foco principal na alta disponibilidade e soluções de recuperação de desastres (RAC, Data Guard, RMAN, ...). Mahir está atualmente trabalhando no Banco Central da República do Azerbaijão. Ele é um DBA OCP. Mahir é membro fundador do Azerbaijão a Oracle User Group (AZEROUG); também é um blogger. Siga Mahir em seu blog http://www.mahir-quluzade.com

Flávio Soares é um Oracle DBA Sênior, Exadata DMA, Troubleshooter e Consultor Oracle, certificado em OCP/OCE RAC. Especialista em Exadata, alta disponibilidade e replicação de dados com soluções Oracle. Flávio disponibiliza frequentes informações para a comunidade Oracle através do seu blog http://flaviosoares.com/pt

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.