| 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:
-
Sem índice em
C.CIDADE - Join usando nested loop pesado
- Alto volume de leitura
- 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étrica | Antes | Depois |
|---|---|---|
| CPU | 🔥 Alto | ⚡ Baixo |
| Tempo | 🐢 Lento | 🚀 Rápido |
| I/O | Alto | Reduzido |
💣 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
Sem comentários:
Enviar um comentário