| Bellacosa Mainframe explique Explain e Access Path |
💥 DB2 LAB: EXPLAIN + ACCESS PATH (na prática)
🎯 Objetivo
👉 Entender como o Db2 decide acessar os dados
👉 Identificar quando está lento
👉 Corrigir com índice + estatísticas
🧪 PARTE 1 — Criando o cenário (problema real)
🔹 Tabela sem índice
CREATE TABLE VAGNER.CLIENTES (
ID INTEGER,
NOME VARCHAR(50),
CIDADE VARCHAR(50)
);
🔹 Inserindo volume (simulação)
INSERT INTO VAGNER.CLIENTES VALUES (1,'ANA','SP');
INSERT INTO VAGNER.CLIENTES VALUES (2,'JOAO','RJ');
-- imagine milhares de registros...
🔹 Query problemática
SELECT * FROM VAGNER.CLIENTES
WHERE ID = 2;
💡 Parece simples… mas sem índice:
💥 TABLE SPACE SCAN (varre tudo)
🔍 PARTE 2 — Rodando EXPLAIN
🔹 Comando
EXPLAIN PLAN FOR
SELECT * FROM VAGNER.CLIENTES
WHERE ID = 2;
🔹 Consultando resultado
SELECT
PLANNO,
METHOD,
ACCESSTYPE,
MATCHCOLS
FROM PLAN_TABLE;
💣 Interpretação
| Campo | Significado |
|---|---|
| ACCESSTYPE = 'R' | Table scan 😬 |
| ACCESSTYPE = 'I' | Index scan 😎 |
| MATCHCOLS | Quantas colunas do índice usadas |
⚠️ Resultado esperado (ruim)
ACCESSTYPE = R
👉 Tradução:
Db2 está varrendo a tabela inteira
🚀 PARTE 3 — Corrigindo (tuning real)
🔹 Criar índice
CREATE INDEX IDX_CLIENTES_ID
ON VAGNER.CLIENTES (ID);
🔹 Atualizar estatísticas
RUNSTATS TABLESPACE VAGNER.TSCLIENTES;
💡 Sem RUNSTATS:
O otimizador fica “cego”
🔁 PARTE 4 — Rodar EXPLAIN novamente
Mesmo comando:
EXPLAIN PLAN FOR
SELECT * FROM VAGNER.CLIENTES
WHERE ID = 2;
✅ Novo resultado
ACCESSTYPE = I
MATCHCOLS = 1
👉 Agora sim:
⚡ Usa índice
⚡ Muito mais rápido
💥 PARTE 5 — Comparação real
| Antes | Depois |
|---|---|
| Table scan | Index scan |
| Lento 🐢 | Rápido ⚡ |
| Alto CPU | Baixo CPU |
🧠 PARTE 6 — Entendendo o Access Path
👉 O otimizador decide baseado em:
- Estatísticas (RUNSTATS)
- Índices disponíveis
- Filtro (WHERE)
- Volume de dados
💣 CASOS REAIS DE PRODUÇÃO
⚠️ 1. Índice existe, mas não usa
👉 Possível causa:
- RUNSTATS desatualizado
⚠️ 2. MATCHCOLS = 0
👉 Índice não está sendo aproveitado
⚠️ 3. SELECT *
👉 Pode forçar acesso desnecessário
🔥 DICAS DE OURO
✔ Sempre rodar EXPLAIN antes de produção
✔ Criar índice baseado no WHERE
✔ Atualizar RUNSTATS regularmente
✔ Evitar SELECT *
🧠 MINI CHECKLIST (antes de subir código)
- EXPLAIN OK?
- ACCESSTYPE = I?
- MATCHCOLS > 0?
- RUNSTATS atualizado?
😎 FRASE DE SENIOR
“Sem EXPLAIN, você está programando no escuro.”