Translate

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

quarta-feira, 21 de janeiro de 2026

💥 DB2 LAB: EXPLAIN + ACCESS PATH (na prática)

 

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

CampoSignificado
ACCESSTYPE = 'R'Table scan 😬
ACCESSTYPE = 'I'Index scan 😎
MATCHCOLSQuantas 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

AntesDepois
Table scanIndex scan
Lento 🐢Rápido ⚡
Alto CPUBaixo 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.”