Início / Trilha 4 / Conteúdo / Tópico 5
5

Tuning de Memória

SGA, PGA, buffer cache, shared pool

📖

Definição

Arquitetura de Memória Oracle

SGA - System Global Area (Memória Compartilhada)

Memória compartilhada entre todos os processos. Componentes principais:

  • Buffer Cache: Cache de blocos de dados das tabelas/índices
  • Shared Pool: Cache de SQL, PL/SQL, data dictionary
  • Redo Log Buffer: Buffer circular para logs de transações
  • Large Pool: Para operações grandes (RMAN, shared servers)
  • Java Pool: Memória para JVM (se usar Java no banco)

PGA - Program Global Area (Memória Privada)

Memória privada de cada sessão/processo. Usada para:

  • Sort Area: Operações de ORDER BY, GROUP BY
  • Hash Area: Hash joins e agregações
  • Bitmap Merge: Merge de índices bitmap
  • Session Memory: Variáveis de sessão, cursores

Automatic Memory Management

MEMORY_TARGET: Oracle gerencia automaticamente SGA e PGA dinamicamente. Recomendado para maioria dos casos (menos administração, boa adaptação à carga).

🛠️

Aplicação Prática

Configurando Memória

-- Ver configuração atual
SELECT name, value/1024/1024 AS value_mb, description
FROM v$parameter
WHERE name IN (
    'memory_target', 'memory_max_target',
    'sga_target', 'sga_max_size',
    'pga_aggregate_target', 'pga_aggregate_limit'
);

-- Opção 1: Gerenciamento Automático (Recomendado)
ALTER SYSTEM SET memory_target = 4G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target = 8G SCOPE=SPFILE;
-- Restart necessário

-- Opção 2: Manual SGA + PGA
ALTER SYSTEM SET memory_target = 0 SCOPE=SPFILE;  -- Desabilita AMM
ALTER SYSTEM SET sga_target = 3G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=SPFILE;
-- Restart necessário

-- Opção 3: Manual detalhado (componentes individuais)
ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE;     -- Desabilita ASMM
ALTER SYSTEM SET db_cache_size = 2G SCOPE=SPFILE;
ALTER SYSTEM SET shared_pool_size = 800M SCOPE=SPFILE;
ALTER SYSTEM SET large_pool_size = 200M SCOPE=SPFILE;
-- Restart necessário

-- Ver uso atual de memória
SELECT
    ROUND(SUM(bytes)/1024/1024/1024, 2) AS sga_gb
FROM v$sgastat;

SELECT
    name,
    ROUND(bytes/1024/1024, 2) AS size_mb
FROM v$sgainfo
ORDER BY bytes DESC;

Monitorando Buffer Cache

-- Buffer Cache Hit Ratio (alvo: > 95%)
SELECT
    name,
    ROUND(((physical_reads - direct_reads) /
           NULLIF(db_block_gets + consistent_gets, 0)) * 100, 2) AS cache_miss_ratio,
    ROUND((1 - ((physical_reads - direct_reads) /
           NULLIF(db_block_gets + consistent_gets, 0))) * 100, 2) AS cache_hit_ratio
FROM v$buffer_pool_statistics
WHERE name = 'DEFAULT';

-- Ver tamanho recomendado pelo advisor
SELECT
    size_for_estimate / 1024 / 1024 AS size_mb,
    size_factor,
    estd_physical_read_factor,
    estd_physical_reads
FROM v$db_cache_advice
WHERE name = 'DEFAULT'
ORDER BY size_for_estimate;

-- Top objetos em buffer cache
SELECT
    o.owner,
    o.object_name,
    o.object_type,
    COUNT(*) AS blocks,
    ROUND(COUNT(*) * 8192 / 1024 / 1024, 2) AS size_mb
FROM v$bh bh
JOIN dba_objects o ON bh.objd = o.data_object_id
GROUP BY o.owner, o.object_name, o.object_type
ORDER BY blocks DESC
FETCH FIRST 20 ROWS ONLY;

Monitorando Shared Pool

-- Library Cache Hit Ratio (alvo: > 95%)
SELECT
    namespace,
    ROUND(gethitratio * 100, 2) AS hit_ratio,
    ROUND(pinhitratio * 100, 2) AS pin_hit_ratio,
    reloads,
    invalidations
FROM v$librarycache
ORDER BY namespace;

-- Ver componentes do Shared Pool
SELECT
    pool,
    name,
    ROUND(bytes/1024/1024, 2) AS size_mb
FROM v$sgastat
WHERE pool = 'shared pool'
ORDER BY bytes DESC;

-- Shared Pool Advisory
SELECT
    shared_pool_size_for_estimate / 1024 / 1024 AS size_mb,
    shared_pool_size_factor,
    estd_lc_time_saved,
    estd_lc_time_saved_factor
FROM v$shared_pool_advice
ORDER BY shared_pool_size_for_estimate;

-- Top SQL por uso de memória
SELECT
    sql_id,
    ROUND(sharable_mem/1024/1024, 2) AS mem_mb,
    executions,
    SUBSTR(sql_text, 1, 100) AS sql_text
FROM v$sql
ORDER BY sharable_mem DESC
FETCH FIRST 20 ROWS ONLY;

-- Flush shared pool (cuidado em produção!)
ALTER SYSTEM FLUSH SHARED_POOL;

Monitorando PGA

-- PGA atual e uso
SELECT
    ROUND(pga_alloc_mem/1024/1024, 2) AS pga_allocated_mb,
    ROUND(pga_used_mem/1024/1024, 2) AS pga_used_mb,
    ROUND(pga_max_mem/1024/1024, 2) AS pga_max_mb
FROM v$process
WHERE program LIKE '%oracle%'
ORDER BY pga_alloc_mem DESC
FETCH FIRST 20 ROWS ONLY;

-- PGA Advisory (tamanho ideal)
SELECT
    pga_target_for_estimate / 1024 / 1024 AS pga_target_mb,
    pga_target_factor,
    estd_pga_cache_hit_percentage AS cache_hit_pct,
    estd_overalloc_count AS overallocation_count
FROM v$pga_target_advice
ORDER BY pga_target_for_estimate;

-- Estatísticas de PGA
SELECT
    name,
    ROUND(value/1024/1024, 2) AS value_mb
FROM v$pgastat
WHERE name IN (
    'aggregate PGA target parameter',
    'aggregate PGA auto target',
    'total PGA inuse',
    'total PGA allocated',
    'maximum PGA allocated'
);

-- Identificar sorts em disco (problema de PGA)
SELECT
    name,
    value
FROM v$sysstat
WHERE name IN (
    'sorts (memory)',
    'sorts (disk)',
    'workarea executions - optimal',
    'workarea executions - onepass',
    'workarea executions - multipass'
);

-- Cálculo: % de sorts em memória (alvo: > 95%)
SELECT
    ROUND((mem.value / NULLIF(mem.value + disk.value, 0)) * 100, 2) AS pct_memory_sorts
FROM
    (SELECT value FROM v$sysstat WHERE name = 'sorts (memory)') mem,
    (SELECT value FROM v$sysstat WHERE name = 'sorts (disk)') disk;

Resultado Esperado

Competências a Dominar

Configurar memória

AMM, manual SGA/PGA, componentes individuais

Monitorar buffer cache

Hit ratios, advisory, objetos em cache

Monitorar shared pool

Library cache, reloads, SQL em memória

Otimizar PGA

Reduzir sorts em disco, ajustar aggregate target

Usar advisory views

Dimensionar memória baseado em dados

Diagnosticar problemas

Identificar contenção, falta de memória

Benchmarks de Hit Ratios

Buffer Cache Hit Ratio: > 95% = Excelente | 90-95% = Bom | < 90% = Aumentar buffer cache
Library Cache Hit Ratio: > 95% = Excelente | 90-95% = Aceitável | < 90% = Aumentar shared pool
Sorts em Memória: > 95% = Excelente | 90-95% = Bom | < 90% = Aumentar PGA
Atenção: Hit ratios altos não garantem boa performance. Analise sempre em conjunto com wait events e AWR.
Anterior: Tuning de SQL Voltar ao Índice