Aplica-se a:
Banco de dados Oracle: 12.1.0.2
Autor:
Mahesh Reddy M
Introdução:
Com o lançamento do banco de dados Oracle 12c In-Memory, um único banco de dados agora pode acomodar com eficiência cargas de trabalho mistas, proporcionando desempenho ideal para transações e, ao mesmo tempo, oferecendo suporte para análise e geração de relatórios em tempo real A tecnologia In-Memory permite que os datamarts e os data warehouses ofereçam uma lógica analítica ainda mais específica, possibilitando aos usuários finais fazer várias consultas sobre os negócios na mesma velocidade que antes levariam para fazer apenas uma. Esses recursos permitem que você armazene colunas, tabelas, partições e exibições materializadas em memória em um formato de coluna, em vez do formato de linha típico. O In-Memory Column Store (armazenamento de coluna IM) foi o recurso principal do conjunto de patches 12.1.0.2.
Arquitetura do banco de dados Oracle 12c In-Memory:
Geralmente, os dados são armazenados somente no formato de linha, em que o banco de dados In-Memory armazena dados somente no formato de coluna. Portanto, o banco de dados Oracle 12c oferece suporte para arquitetura de formato duplo.
- Sempre que os dados são solicitados para operações de leitura/gravação (manipulações de dados), eles são carregados no armazenamento de linha tradicional (cache de buffer)
- Sempre que os dados são solicitados para operações somente leitura, eles são preenchidos em um novo armazenamento de coluna In-Memory. Esse preenchimento inclui uma transformação do formato de linha para o formato de coluna.
- Sempre que uma transação que inclui inserções, atualizações ou exclusões for executada, os novos dados serão exibidos de forma imediata e simultânea tanto no armazenamento de linha como no armazenamento de coluna In-Memory. Portanto, ambos os armazenamentos são consistentes em termos de transação
O armazenamento de coluna In-Memory:
O banco de dados In-Memory usa um armazenamento de coluna In-Memory, que é um novo componente da Área global do sistema (SGA), chamado de Área In-Memory. Os dados do armazenamento de coluna IM não residem no formato de linha tradicional. Em vez disso, ele usa um novo formato de coluna. O armazenamento de coluna IM não substitui o cache de buffer. Em vez disso, funciona como um complemento, para que os dados agora possam ser armazenados em memória tanto no formato de linha como de coluna
A área In-Memory é um pool estático no SGA e seu tamanho é controlado pelo parâmetro de inicialização INMEMORY_SIZE (padrão 0). O tamanho atual da área In-Memory está visível em V$SGA
O armazene de coluna IM está subdividido em dois pools:
- Pool de 1 MB: armazena os dados no formato de coluna reais
- Pool de 64K: armazena os metadados sobre os objetos.
Podemos ver a quantidade de memória disponível em cada pool usando a consulta abaixo
SQL> selecione * em v$inmemory_area;
POOL |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
POOL DE 1 MB |
2.5767E+11 |
2.3569E+11 |
CONCLUÍDO |
1 |
POOL DE 64 KB |
6.4408E+10 |
876347392 |
CONCLUÍDO |
1 |
POOL DE 1 MB |
2.5767E+11 |
2.3569E+11 |
CONCLUÍDO |
2 |
POOL DE 64 KB |
6.4408E+10 |
876347392 |
CONCLUÍDO |
2 |
POOL DE 1 MB |
2.5767E+11 |
2.3569E+11 |
CONCLUÍDO |
3 |
POOL DE 64 KB |
6.4408E+10 |
876347392 |
CONCLUÍDO |
3 |
Tabela 1: memória disponível em cada pool
Ativar o armazenamento de coluna IM:
Como um pool estático, todas as alterações no parâmetro INMEMORY_SIZE não entrarão em vigor até que a instância do banco de dados seja reiniciada. Ele também não é afetado nem controlado pelo Gerenciamento automático de memória (AMM). A área In-Memory deve ter um tamanho mínimo de 100 MB.
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
A interface do ORACLE será iniciada.
A área global total do sistema é de 4.2950E+11 bytes
Tamanhos fixos de 7677400 bytes
Tamanho da variável de 2.0938E+10 bytes
Buffers de banco de dados de 8.5899E+10 bytes
Refazer buffers de 529190912 bytes
Área In-Memory de 3.2212E+11 bytes
Banco de dados montado.
Banco de dados aberto.
Podemos ver as configurações In-Memory usando a consulta abaixo
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 biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
Podemos definir o parâmetro inmemory_size no nível de CDB e PDB. Se você definir esse parâmetro no nível de PDB, não será necessário reiniciar a instância ou o PDB. A soma de todos os valores de PDBs é menor ou igual ao valor de CDB.
É possível ativar ou desativar a opção In-Memory no nível de PDB exibido abaixo
Conecte-se ao PDB e, em seguida, execute o comando abaixo
Desativar:
Altere o conjunto do sistema inmemory_size=0; ou
Altere a redefinição do sistema inmemory_size;
Ativar:
Altere o conjunto de sistemas inmemory_size=20G;
Níveis de prioridade In-Memory:
O armazenamento de coluna IM deve ser preenchido com os dados mais importantes para o desempenho do banco de dados. Dados menos importantes para o desempenho podem ser armazenados em flash ou disco de custo mais baixo. Se o seu banco de dados for pequeno o suficiente, você pode preencher todas as suas tabelas no armazenamento de coluna IM. O banco de dados In-Memory adiciona um novo atributo INMEMORY às tabelas e exibições materializadas.
Podemos ativar o atributo EM MEMÓRIA em
Tablespace, tabela, (sub) partição e exibição materializada.
Se você ativar esse atributo no nível de tablespace, todas as tabelas e exibições materializadas no tablespace serão ativadas para o armazenamento DE COLUNA IM por padrão.
alterar a busca de tablespace EM MEMÓRIA;
Se você ativar esse atributo no nível da tabela, significa que todas as colunas da tabela devem ser preenchidas no armazenamento DE COLUNA IM. No entanto, é possível preencher apenas o subconjunto de colunas no armazenamento DE COLUNA IM.
Alterar a tabela quest_tab INMEMORY NO Inmemory (EMP);
O mesmo se aplica à tabela particionada
Alterar tabela quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Processos de segundo plano:
IMCO: o processo de segundo plano IMCO inicia o preenchimento (pré-preenchimento) de objetos habilitados para tecnologia In-Memory com prioridade BAIXA/MÉDIA/ALTA/CRÍTICA.
SMCO: o SMCO gera dinamicamente processos secundários (Wnnn) para implementar essas tarefas.
Wnnn: os processos Wnnn executam as tarefas de preencher In-Memory e repreencher In-Memory para preenchimento ou repreenchimento de objetos habilitados para tecnologia In-Memory.
Os objetos são preenchidos no armazenamento de coluna IM em uma lista priorizada imediatamente depois que o banco de dados é aberto ou depois que eles são verificados (consultados) pela primeira vez. A ordem na qual os objetos são preenchidos é controlada pela palavra-chave PRIORIDADE, que tem cinco níveis. A PRIORIDADE padrão é NENHUMA, o que significa que um objeto é preenchido somente depois de ser examinado pela primeira vez
Diferentes níveis de prioridade controlados pela subcláusula PRIORIDADE da cláusula de EM MEMÓRIA
Descrição do nível de prioridade
CRÍTICA: o objeto é preenchido imediatamente depois que o banco de dados é aberto
ALTA: o objeto é preenchido após o preenchimento de todos os objetos CRÍTICOS
MÉDIA: o objeto é preenchido após o preenchimento de todos os objetos CRÍTICOS E ALTOS
BAIXA: o objeto é preenchido após o preenchimento de todos os objetos CRÍTICOS, ALTOS E MÉDIOS
NENHUMA: objeto só é preenchido após a primeira verificação (padrão)
Objetos menores que 64 KB não são preenchidos na memória, pois eles perderão uma quantidade considerável de espaço no armazenamento de coluna IM, já que a memória é alocada em fragmentos de 1 MB.
Por exemplo: alterar busca da tabela em memória de prioridade crítica;
Técnicas de compactação In-Memory:
O armazenamento de coluna IM utiliza formatos especiais de compactação otimizados para velocidade de acesso em vez de redução do armazenamento. O banco de dados aumenta a velocidade das seguintes maneiras:
- Os formatos de compactação permitem que o banco de dados diminua a quantidade de memória processada para cada coluna. O SQL é executado diretamente nas colunas compactada.
- O banco de dados usa instruções de vetor (array) SIMD para processar valores de um array de coluna em um único ciclo de relógio da CPU. O banco de dados pode armazenar vários valores em um vetor, o que maximiza os benefícios de desempenho com o processamento do vetor SIMD.
A compactação In-Memory é especificada usando a palavra-chave MEMCOMPRESS, uma subcláusula do atributo INMEMORY. Há seis níveis, cada um deles oferece um nível diferente de compactação e desempenho.
Sem Memcompress: os dados são preenchidos no In-Memory sem compactação.
Compactação de memória para DML: voltado principalmente para o desempenho de DML e a compactação mínima.
Compactação de memória para baixa consulta: otimizada para desempenho de consulta (padrão).
Compactação de memória para alta consulta: otimizada para desempenho de consulta e economia de espaço
Compactação de memória para baixa capacidade: mais economia de espaço para consulta alta e baixa
Compactação de memória para alta capacidade: otimizada para economia de espaço e desempenho um pouco menor.
As taxas de compactação podem variar de 2x a 20 x, dependendo da opção de compactação escolhida, do tipo de dados e do conteúdo da tabela.
Por exemplo: alterar busca de tabela de compactação de memória em memória para alta consulta;
Armazenamento de coluna In-Memory no RAC:
No ambiente do cluster, cada nó tem seu próprio armazenamento de coluna. Cada nó no cluster deve ter o mesmo tamanho do armazenamento de coluna IM. Por padrão, todos os objetos preenchidos na memória serão distribuídos por todos os armazenamentos de coluna IM no cluster. A distribuição de objetos em todos os armazenamentos de colunas IM em um cluster é controlada por duas subcláusulas adicionais do atributo EM MEMÓRIA: DISTRIBUIR e DUPLICAR (somente sistemas projetados).
Distribuir:
Os objetos que são distribuídos em todo o cluster são controlados pela subcláusula de distribuição. Você pode distribuir os objetos da seguinte maneira:
Distribuir por intervalo de linha: distribui os objetos por linhas para nós diferentes
Distribuir por partição: distribui as partições para nós no cluster
Distribuir por subpartição: distribui a subpartição para nós diferentes.
Por exemplo: alterar busca de tabela de distribuição em memória por partição;
Aqui, é importante dizer que o Oracle RAC In-Memory é uma
arquitetura sem compartilhamento para consultas. Por exemplo, se você criar uma consulta de objetos de dados inmemory (supondo que os objetos foram distribuídos em dois armazenamentos de coluna IM), é possível acessar os dados armazenados somente no nó de afinidade. Isso significa que você não deve compartilhar as IMCUs (Inmemory compression units, unidades de compactação In-Memory) nas instâncias do cluster.
Portanto, você pode definir
o grau de paralelismo (DOP) para automático. O coordenador de consulta paralela identifica as outras instâncias do local da IMCU. Se você conseguir definir o DOP como automático, o coordenador da consulta paralela não usará as outras instâncias das IMCUs.
defina o grau de paralelo para automático
altere a configuração do sistema parallel_degree_policy=AUTO scope=both sid='*';
Duplicar:
Para aumentar a disponibilidade, os objetos são copiados em todas as instâncias. Você pode usar a subcláusula de duplicação para especificar que a tabela de em memória está armazenada em todas as instâncias no cluster. Para sistemas não projetados, essa opção não funciona.
Por exemplo: alterar a busca de tabela em memória para duplicar todos;
a tabela buscada é armazenada em todas as instâncias.
Como monitorar objetos In-Memory:
Para monitorar objetos em memória, a Oracle lançou duas novas exibição V$:
v$IM_SEGMENTS ou v$IM_USER_SEGMENTS e v$IM_COLUMN_LEVEL.
Ao usar essas exibições, podemos descobrir quantos objetos estão preenchidos no armazenamento DE COLUNA IM.
Por exemplo
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
Por exemplo
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
No exemplo acima, você perceberá que duas das tabelas (Cliente e Fornecedor) não têm um valor para a coluna Em memória. O atributo EM MEMÓRIA é um atributo de nível de segmento. As tabelas Cliente e Fornecedor são particionadas e, portanto, são objetos lógicos. O atributo EM MEMÓRIA para essas tabelas será registrado no nível da partição ou da subpartição em *_TAB_ (SUB) PARTITIONS.
Três colunas adicionais (INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE e INMEMORY_COMPRESSION) também foram adicionadas às exibições *_TABLES para indicar os atributos Em memória atuais de cada tabela.