Translate

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

quinta-feira, 7 de setembro de 2023

☕💣 PADAWAN, SUA QUERY ACABOU DE DERRUBAR O CICS?

Bellacosa Mainframe e o padawan perigoso nas querys db2


☕💣 PADAWAN, SUA QUERY ACABOU DE DERRUBAR O CICS?

Como Escrever SELECTs Performáticos no DB2 for z/OS Sem Virar Inimigo do DBA

Existe um momento na vida de todo profissional Mainframe em que ele descobre uma verdade dolorosa:

A query funciona.

Mas a CPU não gosta dela.

O usuário não gosta dela.

O DBA não gosta dela.

E o gerente de produção definitivamente não gosta dela.

O iniciante normalmente pensa:

"Mas ela trouxe o resultado correto."

O DB2 pensa:

"Sim. Depois de ler 800 milhões de linhas."

É aí que nasce a diferença entre um programador SQL e um especialista em performance DB2.

Hoje vamos aprender como analisar uma consulta SQL antes que ela se transforme em um incidente de produção.

Prepare seu café.

Vamos conversar sobre CPU, índices, Access Path e sobrevivência corporativa.


O PRIMEIRO MANDAMENTO

Nunca confie numa query apenas porque ela funciona

Muitos iniciantes executam:

SELECT *
FROM CLIENTES
WHERE CPF='12345678900';

O resultado aparece instantaneamente no ambiente de testes.

Eles ficam felizes.

Mas esquecem que:

  • Teste possui poucos registros

  • Produção possui bilhões

  • Teste tem poucos usuários

  • Produção tem milhares

Uma query aparentemente inocente pode consumir milhares de segundos de CPU diariamente.


PASSO 1 — APRENDA A LER O EXPLAIN

O EXPLAIN é o raio-x da consulta.

Antes de colocar qualquer SQL importante em produção execute:

EXPLAIN PLAN SET QUERYNO = 1001
FOR
SELECT ...

O DB2 gravará informações em tabelas como:

  • PLAN_TABLE

  • DSN_STATEMNT_TABLE

  • DSN_FUNCTION_TABLE

Ali está a verdade.

Não a opinião do desenvolvedor.


PASSO 2 — DESCUBRA O ACCESS PATH

O Access Path é a rota escolhida pelo otimizador.

Você quer ver algo parecido com:

MATCHCOLS = 3
ACCESS = I
INDEX ONLY = Y

Ou seja:

  • usando índice

  • poucas leituras

  • acesso eficiente

Você NÃO quer encontrar:

ACCESS = R

ou

TABLESPACE SCAN

Isso significa:

"Vou ler tudo."

É como procurar um CPF lendo uma lista telefônica inteira.


PASSO 3 — OLHE O MATCHCOLS

Padawan, grave isso.

MATCHCOLS é uma das colunas mais importantes do EXPLAIN.

Suponha índice:

IX01

CPF
AGENCIA
CONTA

Consulta:

WHERE CPF = ?

MATCHCOLS = 1

Excelente.


Consulta:

WHERE CPF = ?
AND AGENCIA = ?

MATCHCOLS = 2

Melhor ainda.


Consulta:

WHERE AGENCIA = ?

MATCHCOLS = 0

Problema.

O DB2 não consegue aproveitar o início do índice.


PASSO 4 — ANALISE A FILTRAGEM

O índice deve reduzir o universo de dados.

Imagine:

Tabela:

100 milhões de linhas

Cláusula:

WHERE SEXO='M'

Se 50 milhões possuem M.

O filtro é ruim.


Agora:

WHERE CPF='12345678900'

Retorna uma linha.

Excelente seletividade.

Quanto mais seletivo, melhor.


PASSO 5 — CUIDADO COM O LIKE

Boa consulta:

WHERE NOME LIKE 'CARLOS%'

Pode utilizar índice.


Consulta perigosa:

WHERE NOME LIKE '%CARLOS%'

O DB2 normalmente perde o acesso direto.

Resultado:

CPU sobe.

GETPAGE sobe.

Tempo sobe.

O DBA chora.


PASSO 6 — EVITE FUNÇÕES NA COLUNA INDEXADA

Ruim:

WHERE YEAR(DATA_NASCIMENTO)=2025

O índice pode ser ignorado.

Melhor:

WHERE DATA_NASCIMENTO
BETWEEN '2025-01-01'
AND '2025-12-31'

Agora o índice pode ser explorado.


PASSO 7 — NÃO USE SELECT *

Erro clássico:

SELECT *
FROM CLIENTES

O DB2 buscará tudo.

Inclusive colunas que você não precisa.

Melhor:

SELECT
CPF,
NOME,
LIMITE
FROM CLIENTES

Menos I/O.

Menos CPU.

Menos rede.

Menos buffer pool.


PASSO 8 — DESCUBRA SE O ÍNDICE É BOM

Pergunte:

Ele atende o WHERE?

Exemplo:

WHERE CPF=?

Índice:

CPF

Excelente.


Ele atende ORDER BY?

Consulta:

WHERE CPF=?
ORDER BY DATA

Índice:

CPF
DATA

Excelente.

Pode eliminar SORT.


Ele atende JOIN?

Consulta:

CLIENTE.ID
=
PEDIDO.ID_CLIENTE

A coluna do JOIN deveria estar indexada.


PASSO 9 — PROCURE SORTS DESNECESSÁRIOS

O SORT é um consumidor profissional de CPU.

Se aparecer:

SORTN_ORDERBY = Y

investigue.

Talvez um índice resolva.


PASSO 10 — ANALISE O CUSTO ESTIMADO

DB2 12 e DB2 13 fornecem estimativas importantes.

Observe principalmente:

TOTAL_COST
CPU_COST
IO_COST

Ferramentas como:

  • Data Studio

  • Optim Query Workload Tuner

  • IBM Data Server Manager

mostram essas informações de forma amigável.

CPU_COST elevado é sinal de atenção.


PASSO 11 — OLHE OS GETPAGES

DBAs experientes adoram GETPAGE.

Porque ele mostra quantas páginas serão lidas.

Exemplo:

GETPAGE = 100

Ótimo.


GETPAGE = 8.000.000

Hora de revisar a query.


PASSO 12 — VERIFIQUE RUNSTATS

Às vezes a query é boa.

O índice é bom.

Mas as estatísticas são ruins.

Verifique:

RUNSTATS atualizado?

Sem estatísticas confiáveis o otimizador toma decisões erradas.


PASSO 13 — REORG IMPORTA

Um índice pode existir.

Mas estar fragmentado.

Nesse cenário:

  • mais I/O

  • mais CPU

  • mais elapsed time

REORG continua sendo um dos melhores amigos da performance.


PASSO 14 — CUIDADO COM O ONLINE

Batch e Online são mundos diferentes.

No Batch:

5 segundos

Pode ser aceitável.

No Online:

5 segundos

Pode ser uma catástrofe.

Imagine:

1000 usuários simultâneos.

Cada um executando uma query de 5 segundos.

O gargalo nasce rapidamente.


PASSO 15 — A REGRA DE OURO DO PADAWAN

Antes de promover uma query para produção pergunte:

✅ Existe índice?

✅ O índice é utilizado?

✅ O MATCHCOLS é bom?

✅ Existe TABLESPACE SCAN?

✅ Existe SORT desnecessário?

✅ O filtro é seletivo?

✅ Os RUNSTATS estão atualizados?

✅ O GETPAGE está razoável?

✅ O CPU_COST parece aceitável?

✅ O tempo de resposta atende o SLA?

Se alguma resposta for não...

Volte para a oficina.


O SEGREDO DOS MESTRES DB2

Programadores iniciantes escrevem SQL.

Programadores experientes analisam EXPLAIN.

Especialistas DB2 pensam como o otimizador.

Quando você começa a prever qual índice será utilizado, qual access path será escolhido e qual será o impacto em CPU antes mesmo de executar a query, você deixa de ser apenas um desenvolvedor.

Você começa a enxergar o banco pelos olhos do DB2.

E é nesse momento que o Padawan se aproxima do nível Jedi Mainframe.

Porque no universo do DB2, o objetivo não é apenas retornar dados.

O objetivo é retornar dados rapidamente, consumindo o mínimo possível de CPU, evitando filas no CICS, gargalos no DDF, explosões de GETPAGE e telefonemas desesperados da equipe de produção às duas da manhã.

Que a Força do Access Path esteja com você.


sexta-feira, 15 de fevereiro de 2019

☕🔥 DB2 z/OS — COMO IDENTIFICAR THREADS PRESOS, PROBLEMAS DE POOL, CPU, MEMÓRIA, LOG E PERFORMANCE


 

Bellacosa Mainframe analisando o DB2 em busca de problemas

☕🔥 DB2 z/OS — COMO IDENTIFICAR THREADS PRESOS, PROBLEMAS DE POOL, CPU, MEMÓRIA, LOG E PERFORMANCE

No Db2 Mainframe, praticamente tudo gira em torno de:

  • Threads

  • Buffer Pools

  • EDM Pool

  • Logging

  • Tablespaces

  • I/O

  • CPU

  • Storage

  • Rede (DDF/DRDA)

  • Tempo de resposta

O segredo do Sysprog/DBA é saber:

“QUAL COMANDO MOSTRA O QUE ESTÁ SOFRENDO?”


🔥 1 — IDENTIFICANDO THREADS PRESOS (HANG / LOCK / DEADLOCK)


✅ COMANDO MAIS IMPORTANTE

-DISPLAY THREAD(*)

ou resumido:

-DIS THD(*)

📌 O que ele mostra

  • Threads ativos

  • Usuário

  • Plano

  • CPU consumida

  • Tempo ativo

  • WAITs

  • Locks

  • Corrrelation ID

  • Workstation

  • DDF

  • CICS

  • Batch


✅ EXEMPLO PRÁTICO

-DIS THD(*) TYPE(ACTIVE)

Saída típica:

STATUS=WAIT
PLAN=DSNESPCS
AUTHID=APPUSER
CORRID=CICS001
ELAPSED=00:12:55

📌 Interpretação

CampoSignificado
WAITThread parada esperando
ELAPSED altoPossível travamento
CICS001Região CICS origem
PLANAplicação responsável

🔥 Identificando lock

-DIS DATABASE(DBPAGTO) LOCKS

Exemplo

RESOURCE TYPE = PAGESET
LOCK STATE = CLAIM

📌 Isso indica

  • Objeto preso

  • Thread segurando lock

  • Possível contention


🔥 DEADLOCKS

-DIS THREAD(*) SERVICE(WAIT)

Procure:

STATUS=WAIT

🔥 CANCELANDO THREAD PROBLEMÁTICA

-CANCEL THREAD(token)

ou:

-CANCEL DDF THREAD(*)

Cuidado:

  • Pode causar rollback gigante

  • Pode explodir log

  • Pode gerar timeout em cascata


☕ 2 — PROBLEMAS EM BUFFER POOL

Bufferpool = cache de páginas do Db2.

Quando sofre:

  • CPU sobe

  • I/O explode

  • Tempo resposta piora


✅ COMANDO

-DISPLAY BUFFERPOOL(BP0)

ou:

-DIS BPOOL(BP0)

📌 O QUE ANALISAR

CampoProblema
VPSEQTMuito alto → sequential flooding
HIT RATIOBaixo → excesso de I/O
PREFETCHIneficiente
WRITE ENGINEGargalo disco

✅ EXEMPLO

-DIS BPOOL(BP1)

Saída:

HIT RATIO = 72%

📌 Interpretação

Muito ruim.

Ideal:

TipoIdeal
OLTP> 95%
Batch> 85%

🔥 ALTERANDO BUFFERPOOL

-ALTER BUFFERPOOL(BP1) VPSIZE(200000)

📌 O que isso faz

Aumenta memória do pool.

Menos I/O.
Menos CPU.
Mais cache.


☕ 3 — PROBLEMAS EM TABLESPACE


✅ STATUS DO TABLESPACE

-DIS DATABASE(DBFIN) SPACENAM(TSPAGTO)

📌 O QUE PROCURAR

StatusSignificado
STOPPparado
AREO*advisory reorg
RECPrecovery pending
COPYprecisa COPY
GRECPgroup recovery pending

✅ EXEMPLO

STATUS=AREO*

📌 Interpretação

Tablespace precisa REORG.

Impactos:

  • Performance ruim

  • Overflow

  • Mais GETPAGE

  • Mais CPU


🔥 RESOLVENDO

REORG TABLESPACE DBFIN.TSPAGTO

☕ 4 — ALTO CONSUMO DE CPU


✅ THREADS CONSUMINDO CPU

-DIS THREAD(*) DETAIL

Procure:

CPU=

📌 Exemplo

CPU=000123.456

Possíveis causas

ProblemaEfeito
SQL ruimCPU explode
Tablespace fragmentadoMais GETPAGE
Índice erradoTable scan
RUNSTATS antigoAccess path ruim
Lock contentionReprocessamento

🔥 COMANDO IMPORTANTE

-DIS STATS

📌 Mostra

  • EDM pool

  • Dynamic SQL cache

  • RID pool

  • Sort

  • Storage


☕ 5 — ALTO CONSUMO DE MEMÓRIA (STORAGE)


✅ COMANDO

-DIS STORAGE

📌 Mostra

  • Above the bar

  • Below the bar

  • 31-bit

  • 64-bit

  • Agentes Db2


EXEMPLO

DBM1
MSTR
DIST

📌 Interpretação

Address SpaceFunção
DBM1Buffer pools
MSTRControle
DISTDDF/network

🔥 STORAGE LEAK

Sinais:

  • DIST crescendo sem parar

  • Threads DDF não encerram

  • EDM saturado


☕ 6 — PROBLEMAS COM LOG DATASET

O log é o coração do recovery.

Quando sofre:

  • Commit lento

  • Rollback lento

  • Batch trava

  • CICS congela


✅ COMANDO

-DIS LOG

📌 Mostra

  • Active logs

  • Archive logs

  • Checkpoints

  • Utilização


EXEMPLO

ACTIVE LOG COPY 1
ACTIVE LOG COPY 2

📌 O QUE PROCURAR

ProblemaSinal
Log fullarchive atrasado
Checkpoint lentocommit lento
Dual logging falhandorisco recovery

🔥 LOG SATURADO

Mensagem clássica:

DSNJ110I

ou:

ARCHIVE LOG REQUIRED

🔥 SOLUÇÃO

  • Mais active logs

  • Logs maiores

  • Melhor disco

  • Archive mais rápido


☕ 7 — TEMPO DE RESPOSTA LENTO


✅ COMANDO

-DIS THREAD(*) DETAIL

Compare:

CampoInterpretação
ELAPSEDtempo total
CPUCPU real
SUSPENDespera

📌 EXEMPLO

ELAPSED=00:10:00
CPU=00:00:03

Interpretação

O problema NÃO é CPU.

É:

  • WAIT

  • I/O

  • Lock

  • Rede

  • Commit

  • Syncpoint


☕ 8 — PROBLEMAS DE REDE / DDF / DRDA

Muito comum hoje com:

  • Java

  • APIs

  • Microservices

  • JDBC

  • REST


✅ COMANDO

-DIS DDF

📌 Mostra

  • Threads distribuídas

  • TCP/IP

  • Localização

  • Status


EXEMPLO

STATUS=STARTD

🔥 THREADS DDF

-DIS THREAD(*) TYPE(SYSTEM)

📌 Procure

DIST

🔥 MUITAS CONEXÕES

Problemas:

  • Java pool ruim

  • Connection leak

  • Firewall timeout

  • Keepalive errado


☕ 9 — IDENTIFICANDO I/O EXCESSIVO


✅ COMANDO

-DIS BUFFERPOOL(BP0) DETAIL

Procure

CampoSignificado
SYNCH READleitura síncrona
PREFETCHleitura antecipada
WRITE I/Oescrita

📌 Se SYNCH READ sobe

Significa:

  • Cache ruim

  • Índice ruim

  • SQL ruim

  • Pool pequeno


☕ 10 — COMANDOS MAIS IMPORTANTES DO DBA/SYSPROG DB2

ObjetivoComando
Ver threads-DIS THREAD(*)
Ver locks-DIS DB(...) LOCKS
Ver bufferpool-DIS BPOOL
Ver log-DIS LOG
Ver storage-DIS STORAGE
Ver DDF-DIS DDF
Ver tablespace-DIS DB(...) SPACENAM
Ver utilities-DIS UTILITY(*)
Ver claims/drains-DIS DB(...) CLAIMERS
Ver status geral-DIS GROUP

☕🔥 FLUXO MENTAL DE TROUBLESHOOTING NO Db2


🚨 Usuário reclamou de lentidão

PASSO 1

-DIS THREAD(*) DETAIL

Ver:

  • CPU

  • WAIT

  • ELAPSED


PASSO 2

-DIS BPOOL(BP0) DETAIL

Ver:

  • Hit ratio

  • Sync I/O


PASSO 3

-DIS LOG

Ver:

  • Saturação

  • Checkpoint


PASSO 4

-DIS DB(...) LOCKS

Ver lock contention.


PASSO 5

-DIS STORAGE

Ver memory pressure.


☕🔥 SINTOMAS CLÁSSICOS E CAUSAS

SintomaPossível causa
CPU altaSQL ruim
ELAPSED altoWAIT/I/O
Commit lentoLog
DIST giganteJDBC leak
Lock timeoutThread presa
GETPAGE altoREORG necessário
Sync read altoPool pequeno
RID failureRID pool
EDM cheioDynamic SQL excessivo

☕🔥 O QUE OS GRANDES DBAs FAZEM

Eles sempre correlacionam:

  • THREAD

  • LOCK

  • BUFFERPOOL

  • SQL

  • LOG

  • STORAGE

  • DDF

Nunca analisam apenas um comando isolado.

Porque no Db2:

“O sintoma aparece em um lugar…
mas a causa real geralmente está em outro.”