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

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 StoreA 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

Deixe um comentário