Translate

Mostrar mensagens com a etiqueta tuning db2. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta tuning db2. Mostrar todas as mensagens

sexta-feira, 23 de janeiro de 2026

💥 DB2 - CENÁRIO: CPU EXPLODINDO EM PRODUÇÃO

 

Bellacosa Mainframe estudo do caso CPU Explodindo

💥 DB2 - CENÁRIO: CPU EXPLODINDO EM PRODUÇÃO

🧪 Situação

  • Batch rodando há anos
  • De repente: ⬆ CPU / ⬆ elapsed time
  • Usuários reclamando
  • SLA estourando

⚠️ QUERY PROBLEMÁTICA

SELECT *
FROM VAGNER.PEDIDOS P
JOIN VAGNER.CLIENTES C
ON P.CLIENTE_ID = C.ID
WHERE C.CIDADE = 'SAO PAULO';

💣 SINTOMAS

  • CPU alto 🔥
  • Long elapsed time
  • I/O elevado
  • Threads presas

🔍 PASSO 1 — EXPLAIN (descobrindo o vilão)

👉 Você roda EXPLAIN e vê:

ACCESSTYPE = R (TABLE SCAN)
METHOD = 1 (Nested Loop)
MATCHCOLS = 0

🧠 DIAGNÓSTICO

💥 Problemas identificados:

  1. Sem índice em C.CIDADE
  2. Join usando nested loop pesado
  3. Alto volume de leitura
  4. SELECT * (puxa dados desnecessários)

🚨 CAUSA REAL DO CPU ALTO

👉 Db2 está:

  • Varredura completa (scan)
  • Fazendo join linha a linha
  • Lendo MUITO mais dados que precisa

💡 Tradução:

Está trabalhando demais pra responder pouco


🚀 PASSO 2 — CORREÇÃO (TUNING REAL)

🔹 1. Criar índice estratégico

CREATE INDEX IDX_CLIENTES_CIDADE
ON VAGNER.CLIENTES (CIDADE);

🔹 2. Índice para JOIN

CREATE INDEX IDX_PEDIDOS_CLIENTE
ON VAGNER.PEDIDOS (CLIENTE_ID);

🔹 3. Evitar SELECT *

SELECT P.ID, C.NOME
FROM VAGNER.PEDIDOS P
JOIN VAGNER.CLIENTES C
ON P.CLIENTE_ID = C.ID
WHERE C.CIDADE = 'SAO PAULO';

🔹 4. Atualizar estatísticas

RUNSTATS TABLESPACE VAGNER.TSCLIENTES;
RUNSTATS TABLESPACE VAGNER.TSPEDIDOS;

🔁 PASSO 3 — NOVO EXPLAIN

Agora você vê:

ACCESSTYPE = I
MATCHCOLS > 0
METHOD = melhor otimizado

📊 RESULTADO REAL

MétricaAntesDepois
CPU🔥 Alto⚡ Baixo
Tempo🐢 Lento🚀 Rápido
I/OAltoReduzido

💣 OUTROS CENÁRIOS DE CPU ALTO (VIDA REAL)

⚠️ 1. Falta de filtro

SELECT * FROM PEDIDOS;

👉 Scan total = CPU alto


⚠️ 2. Função no WHERE

WHERE UPPER(NOME) = 'ANA'

👉 Índice ignorado 😬


⚠️ 3. OR mal usado

WHERE CIDADE = 'SP' OR CIDADE = 'RJ'

👉 Pode quebrar índice


⚠️ 4. RUNSTATS desatualizado

👉 Otimizador toma decisão ruim


⚠️ 5. Índice errado

👉 Existe… mas não ajuda


🧠 CHECKLIST DE INCIDENTE (use isso na guerra)

Quando CPU subir:

✔ Rodar EXPLAIN
✔ Ver ACCESSTYPE
✔ Checar índices
✔ Ver RUNSTATS
✔ Analisar SELECT *
✔ Avaliar volume de dados


🔥 FERRAMENTAS QUE AJUDAM

  • EXPLAIN / PLAN_TABLE
  • IFCID 316 (performance)
  • Monitor tipo OMEGAMON
  • Accounting traces

😎 FRASES DE QUEM RESOLVE INCIDENTE

  • “Isso tá fazendo tablespace scan”
  • “O access path mudou”
  • “Faltou índice nesse predicado”
  • “RUNSTATS tá velho”

💥 MENTALIDADE FINAL

👉 CPU alto no Db2 quase nunca é “o mainframe lento”

👉 Normalmente é:

✔ SQL ruim
✔ Índice errado
✔ Estatística desatualizada