| Bellacosa Mainframe explorando o DB2 |
💥 DB2 A REGRA QUE MUDA TUDO
👉 O otimizador NÃO “ama índice”
👉 Ele escolhe o menor custo estimado
💡 Tradução Bellacosa:
Índice ruim pode ser pior que scan completo 😱
🧠 1. TABLESPACE SCAN vs INDEX SCAN
⚡ INDEX SCAN (ACCESSTYPE = 'I')
✔ Busca direta
✔ Poucas linhas retornadas
✔ Usa chave/index
👉 Ideal para:
WHERE ID = 100
🐢 TABLESPACE SCAN (ACCESSTYPE = 'R')
✔ Varre tudo
✔ Melhor quando retorna MUITAS linhas
👉 Ideal para:
SELECT * FROM CLIENTES
💣 CENÁRIO REAL 1 — “ÍNDICE IGNORADO”
🧪 Query
SELECT *
FROM CLIENTES
WHERE CIDADE = 'SAO PAULO';
👉 Você criou índice em CIDADE… mas Db2 usa SCAN 😬
🧠 Por quê?
👉 Baixa seletividade
Se:
- 80% da tabela = “SAO PAULO”
Então:
Índice não compensa
🛠️ Solução
✔ Criar índice composto:
CREATE INDEX IDX1
ON CLIENTES (CIDADE, ID);
✔ Ou melhorar filtro
💣 CENÁRIO REAL 2 — “MATCHCOLS BAIXO”
🧪 Índice:
CREATE INDEX IDX2
ON CLIENTES (CIDADE, NOME);
🧪 Query:
SELECT * FROM CLIENTES
WHERE NOME = 'ANA';
😬 Resultado
👉 MATCHCOLS = 0
🧠 Por quê?
👉 Ordem do índice importa!
🛠️ Correção
✔ Criar índice correto:
CREATE INDEX IDX3
ON CLIENTES (NOME);
💣 CENÁRIO REAL 3 — “SELECT * MATA PERFORMANCE”
🧪 Query
SELECT * FROM CLIENTES
WHERE ID = 10;
🧠 Problema
Mesmo com índice:
👉 Pode forçar acesso à tabela (data page)
🛠️ Otimização (Index Only Access)
SELECT ID FROM CLIENTES
WHERE ID = 10;
✔ Usa só o índice
✔ Muito mais rápido
💣 CENÁRIO REAL 4 — “RUNSTATS TE TRAIU”
🧪 Situação
- Índice existe
- Query boa
- Mesmo assim: SCAN 😡
🧠 Causa
👉 Estatísticas desatualizadas
🛠️ Solução
RUNSTATS TABLESPACE DB1.TS1;
💡 Sem isso:
Otimizador “chuta”
🚀 CENÁRIO REAL 5 — “RANGE SCAN”
🧪 Query
SELECT * FROM CLIENTES
WHERE ID BETWEEN 1 AND 100;
🧠 Possível acesso
✔ Index range scan
✔ Ou scan completo (depende do volume)
🧠 DECISÃO DO OTIMIZADOR
Ele avalia:
- Cardinalidade
- Seletividade
- Cluster ratio
- Número de páginas
- Estatísticas (RUNSTATS)
💥 GOLDEN RULES (nível expert)
🥇 1. Índice ≠ sempre melhor
🥇 2. Ordem do índice é tudo
🥇 3. RUNSTATS é obrigatório
🥇 4. SELECT * é inimigo
🥇 5. WHERE define performance
🔥 CHECKLIST DE GUERRA
Antes de subir:
✔ EXPLAIN rodado
✔ ACCESSTYPE correto
✔ MATCHCOLS adequado
✔ Índice alinhado ao WHERE
✔ RUNSTATS atualizado
😎 FRASES DE ARQUITETO
- “Isso tá com baixa seletividade”
- “Esse índice não casa com o predicado”
- “O access path tá custando caro”
- “Isso aí vai virar tablespace scan em produção”
| Uma revisão das regras do Db2 |
💣 VISÃO FINAL (MENTALIDADE)
👉 Você não escreve SQL…
👉 Você negocia com o otimizador
Sem comentários:
Enviar um comentário