☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta buffer pool. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta buffer pool. Mostrar todas as mensagens

sábado, 23 de maio de 2026

☕🔥 “O SEGREDO SUJO DA PERFORMANCE NO MAINFRAME” — POR QUE CACHE VALE MAIS QUE CPU NO MUNDO COBOL/CICS

 

Bellacosa Mainframe e a alta performance no mainframe

☕🔥 “O SEGREDO SUJO DA PERFORMANCE NO MAINFRAME” — POR QUE CACHE VALE MAIS QUE CPU NO MUNDO COBOL/CICS

Quando alguém fala em performance, a maioria pensa imediatamente em:

  • CPU,

  • MIPS,

  • zIIP,

  • upgrade de hardware.

Mas no mundo IBM Mainframe existe uma verdade brutal:

☕ O MAIOR INIMIGO DA PERFORMANCE É O I/O.

E por isso:

CACHE É UMA DAS COISAS MAIS IMPORTANTES DO UNIVERSO z/OS.

A imagem mostra 9 estratégias modernas de caching.

Agora vamos traduzir isso para:

  • COBOL,

  • CICS,

  • DB2,

  • VSAM,

  • MQ,

  • Batch,

  • Sysplex,

no puro estilo Bellacosa Mainframe.


☕ 1. CACHE-ASIDE — “BUSQUE SÓ QUANDO PRECISAR”

Na imagem:

  • aplicação procura primeiro no cache,

  • se não encontrar, busca no banco.


🔥 Isso é praticamente a filosofia clássica do CICS

Exemplo:

Programa COBOL/CICS

EXEC CICS READQ TS
END-EXEC.

Se o dado:

  • já estiver em TSQ,

  • COMMAREA,

  • ou memória temporária,

não precisa acessar:

  • DB2,

  • VSAM,

  • disco físico.


☕ Exemplo real

Consulta de cliente VIP:

  • primeira busca → DB2,

  • próximas buscas → memória CICS.


🔥 Resultado

Menos:

  • EXCP,

  • lock,

  • espera,

  • canal I/O.

Mais:

  • TPS,

  • resposta rápida,

  • estabilidade.


☕ 2. READ-THROUGH — “O CACHE BUSCA AUTOMATICAMENTE”


🔥 No mainframe isso aparece muito em DB2 Buffer Pool

O programa COBOL:

nem sabe se o dado veio da memória ou do disco

O DB2 decide.


☕ Fluxo real

SELECT → Buffer Pool → se miss → DASD

🔥 O detalhe importante

Boa parte da má performance em DB2:

NÃO é SQL ruim

mas:

  • buffer pool inadequado,

  • hit ratio baixo,

  • excesso de I/O físico.


☕ Frase clássica de performance analyst

“Seu SELECT talvez esteja ótimo.

Seu disco é que está sofrendo.”


☕ 3. WRITE-THROUGH — “GRAVAR NO CACHE E NO BANCO AO MESMO TEMPO”


🔥 Aqui entra o lado paranoico do mainframe

O IBM Z odeia inconsistência.


☕ Exemplo bancário

PIX:

  • atualiza saldo,

  • atualiza log,

  • atualiza auditoria,

  • confirma persistência.

Tudo sincronizado.


☕ No DB2 isso lembra:

  • commit controlado,

  • logging,

  • buffer synchronization.


🔥 Benefício

Maior consistência.


☕ Problema

Mais latência.


🔥 Mainframe frequentemente escolhe:

CONSISTÊNCIA > VELOCIDADE

porque banco prefere:

“mais lento”

a:

“saldo corrompido”.

☕ 4. WRITE-BEHIND (WRITE-BACK) — “GRAVA DEPOIS”


🔥 Estratégia perigosamente poderosa

Primeiro:

  • grava em memória,

  • depois persiste assíncrono.


☕ No Mainframe aparece em:

  • buffers VSAM,

  • deferred write,

  • MQ persistence strategies,

  • DFSORT spill optimization.


☕ Benefício monstruoso

Reduz I/O físico.


🔥 Risco brutal

Se houver falha antes da persistência:

dado pode sumir.


☕ Por isso no mundo financeiro:

  • write-back é cuidadosamente controlado,

  • logging vira obrigatório,

  • recovery é crítico.


☕ 5. REFRESH-AHEAD — “ATUALIZE ANTES DE EXPIRAR”


🔥 Mainframe faz isso há décadas

Exemplo:

DB2 Prefetch

O sistema prevê páginas futuras.


☕ Outro exemplo

Batch COBOL:

  • pré-carrega tabelas,

  • carrega parâmetros em memória,

  • evita lookup repetitivo.


🔥 Filosofia do z/OS

“Se você SABE que vai precisar…

carregue antes.”


☕ 6. INVALIDATION — “JOGUE FORA O QUE FICOU VELHO”


🔥 Aqui mora um dos maiores pesadelos corporativos

DADO STALE


☕ Exemplo real

Usuário altera endereço.

Mas:

  • cache ainda possui dado antigo.

Resultado:

  • sistema A mostra endereço novo,

  • sistema B mostra antigo.


🔥 No Mainframe isso é gravíssimo

Porque:

  • múltiplos sistemas compartilham informação,

  • inconsistência pode virar problema legal.


☕ Técnicas usadas

  • cache invalidation,

  • commit synchronization,

  • DB2 coherency,

  • Sysplex cache coherence.


☕ 7. CACHE WARMING — “ESQUENTAR O CACHE”


🔥 Todo operador experiente conhece isso

Após IPL:

  • tudo está “frio”.


☕ Resultado clássico

Primeiros minutos:

  • I/O explode,

  • disco sofre,

  • response time piora.


🔥 Então muitos ambientes:

  • executam jobs de preload,

  • aquecem buffer pools,

  • pré-carregam tabelas críticas.


☕ Exemplo Bellacosa

Banco antes da abertura:

pré-carrega contas mais acessadas.

☕ 8. CACHE SHARDING — “DIVIDIR O CACHE”


🔥 Aqui entra Parallel Sysplex

Vários nós:

  • compartilham workload,

  • dividem memória,

  • reduzem contenção.


☕ Exemplo real

Cada região CICS:

  • mantém cache local,

  • mas sincroniza estado global.


🔥 Benefício

Escalabilidade monstruosa.


☕ Desafio

Coerência.


🔥 Porque o pesadelo é:

nó A sabe algo
nó B não sabe

☕ 9. TTL (TIME TO LIVE) — “TUDO TEM PRAZO DE VALIDADE”


🔥 No Mainframe isso é filosofia operacional

Nem todo dado pode viver eternamente no cache.


☕ Exemplos

Taxa de câmbio

TTL pequeno.


Tabela de estados brasileiros

TTL enorme.


🔥 O segredo

Equilibrar:

  • frescor,

  • performance,

  • consistência.


☕ O ERRO CLÁSSICO DOS INICIANTES

Pensar:

“Mais cache = sempre melhor”

🔥 NÃO.

Cache ruim pode gerar:

  • inconsistência,

  • stale data,

  • contenção,

  • explosão de memória,

  • recovery complexo.


☕ O QUE O MAINFRAME ENSINA SOBRE CACHE

Cache não é só velocidade.

É:

  • engenharia de previsibilidade,

  • redução de I/O,

  • estabilidade operacional,

  • proteção contra gargalos.


🔥 Porque no IBM Z:

DISCO É O INIMIGO NATURAL DA PERFORMANCE.


☕ RESUMO BELLACOSA MAINFRAME

EstratégiaNo IBM Mainframe
Cache-AsideTSQ/COMMAREA/lookup local
Read-ThroughDB2 Buffer Pool
Write-ThroughCommit síncrono
Write-BehindDeferred write
Refresh-AheadPrefetch
InvalidationCache coherency
Cache WarmingPreload pós IPL
Cache ShardingSysplex distribution
TTLExpiração controlada

☕🔥 Frase final no estilo Bellacosa Mainframe

“Muita gente acha que Mainframe é rápido por causa da CPU.

Veterano de z/OS sabe:

o segredo quase sempre está em evitar I/O.”

 

domingo, 10 de maio de 2026

🔥☕ DB2 PERFORMANCE TUNING — O “MOTOR INVISÍVEL” DO MAINFRAME IBM Z

 

Bellacosa Mainframe em tuning DB2

🔥☕ DB2 PERFORMANCE TUNING — O “MOTOR INVISÍVEL” DO MAINFRAME IBM Z

Como um SYSprog/DBA Padawan Aprende a Domar SQL, Buffer Pool, RID Pool, SORT e LOCKING no DB2 z/OS 💾🚀

No universo do DB2 for z/OS existe uma verdade brutal:

💣 “O problema quase nunca é o Mainframe.”

O IBM Z aguenta pancada absurda.
Quem normalmente destrói CPU, I/O e tempo de resposta é:

  • SQL mal escrito

  • Buffer pool mal dimensionado

  • RID pool estourando

  • SORT explodindo em WORKFILE

  • Locking gerando contenção

O DB2 é praticamente uma cidade viva dentro do z/OS.
E tuning é aprender onde o trânsito trava. ☕🏛️


🔥 1. SQL TUNING — O VERDADEIRO REI DA PERFORMANCE

💣 Regra número 1:

“O SQL errado derruba até z17.”


☕ O que mais mata performance?

🚨 TABLESPACE SCAN (TBSCAN)

Quando o DB2 lê a tabela inteira.

Exemplo ruim:

SELECT *
FROM CLIENTES
WHERE NOME = 'JOAO'

Sem índice em NOME:

-> scan completo
-> milhões de linhas
-> CPU sobe
-> I/O explode

🔥 Como melhorar?

✅ Use índices corretos

CREATE INDEX IX1
ON CLIENTES (NOME)

🚀 Prefira Stage 1 Predicates

Predicados Stage 1 são processados cedo pelo DB2.

Bom:

WHERE DATA = '2026-05-14'

Ruim:

WHERE YEAR(DATA) = 2026

A função quebra o uso eficiente do índice.


💣 Evite SELECT *

Ruim:

SELECT *

Bom:

SELECT ID, NOME

Menos colunas:

  • menos GETPAGE

  • menos I/O

  • menos CPU


🔥 Verifique o ACCESS PATH

Use:

EXPLAIN PLAN

Olhe:

  • MATCHCOLS

  • INDEX ONLY

  • TBSCAN

  • SORT

  • RID LIST


🚨 Sinais perigosos no EXPLAIN

ProblemaImpacto
TBSCANscan completo
SORTuso pesado de workfile
Hybrid Join ruimCPU explode
List Prefetch excessivoRID pool sofre
Cartesian Joincaos absoluto

☕ Ferramentas clássicas

SPUFI

EXPLAIN YES

PLAN_TABLE

Tabela mágica do DBA.


Visual Explain

No Data Studio ou ferramentas IBM.


🔥 2. BUFFER POOL TUNING — O “CACHE SAGRADO” DO DB2

O Buffer Pool é onde páginas ficam em memória.

Quanto mais HIT:

  • menos I/O

  • menos disco

  • mais velocidade


☕ Conceito simples

Sem buffer pool:

Programa -> Disco

Com buffer pool:

Programa -> Memória

Muito mais rápido.


🔥 Métricas importantes

Buffer Hit Ratio

Ideal:

> 90%

🚨 Sintomas de buffer pool ruim

  • Sync I/O alto

  • Read I/O excessivo

  • CPU esperando disco

  • Response time ruim


☕ Comandos úteis

Ver status

-DISPLAY BUFFERPOOL(BP0) DETAIL

🚀 Alterar tamanho

ALTER BUFFERPOOL BP0 VPSIZE 200000

💣 Mas cuidado…

Buffer pool gigante demais:

  • rouba memória do z/OS

  • aumenta paging

  • piora tudo

Tuning é equilíbrio.


🔥 Estratégia clássica

Separar objetos críticos

Exemplo:

Buffer PoolUso
BP0sistema
BP1OLTP
BP2batch
BP32KLOB/XML

☕ Pagesize correta

TipoPage
OLTP4K
Scan grande32K

🔥 3. RID POOL TUNING — A GUERRA DAS RID LISTS

RID = Record ID.

DB2 usa RID LIST quando:

  • vários índices participam

  • list prefetch ocorre


💣 Quando RID pool estoura…

O DB2 muda estratégia:

RID LIST -> TABLESPACE SCAN

Resultado:
🔥 desastre de performance


☕ Verificar RID pool

-DISPLAY BUFFERPOOL

ou IFCID traces.


🚀 Ajustar tamanho

ZPARM:

MAXRBLK

🔥 Sintomas clássicos

SintomaCausa
RID overflowpool pequeno
fallback para scanRID cheio
CPU altaexcesso de leitura

☕ Soluções

Melhorar índices

Muitas vezes RID pool explode porque:

  • índice ruim

  • predicates ruins

  • cardinalidade ruim


Atualizar RUNSTATS

Sem estatística:
DB2 toma decisões erradas.

RUNSTATS TABLESPACE ...

🔥 4. SORT TUNING — O BURACO NEGRO DO WORKFILE

SORT é caro.

Muito caro.


💣 O que gera SORT?

  • ORDER BY

  • GROUP BY

  • DISTINCT

  • UNION

  • JOIN sem índice


☕ O perigo invisível

SORT -> WORKFILE -> I/O -> CPU -> contenção

🚀 Como reduzir SORT?

Criar índices compatíveis

Exemplo:

SELECT *
FROM VENDAS
ORDER BY DATA

Índice:

CREATE INDEX IXDATA
ON VENDAS(DATA)

O DB2 evita SORT.


🔥 Monitorar WORKFILE

Veja:

  • DSNDB07

  • utilização

  • overflow

  • spill


☕ ZPARMs importantes

ParâmetroFunção
SRTPOOLmemória do sort
MAXSORT_IN_MEMORYsort em memória
DSMAXdatasets

🚨 Sintomas clássicos

  • DSNDB07 lotado

  • I/O absurdo

  • elapsed alto

  • batch lento


🔥 5. LOCKING TUNING — O INFERNO DAS CONTENÇÕES

O DB2 protege dados com locks.

Mas lock demais:
💣 trava o sistema inteiro.


☕ Tipos de lock

TipoNível
Rowlinha
Pagepágina
Tabletabela
Tablespacetudo

🚨 Deadlock

Dois processos esperam um ao outro.

Resultado:

SQLCODE -911
ou
SQLCODE -913

🔥 Timeout

Um processo espera demais.


☕ Estratégias de tuning

✅ Commit frequente

Ruim:

COMMIT a cada 1 milhão

Bom:

COMMIT a cada 1000

🚀 Use LOCKSIZE ROW

LOCKSIZE ROW

Menos contenção.


💣 Evite lock escalation

Quando muitos locks viram lock maior.

Exemplo:

10000 row locks
-> table lock

Caos no OLTP.


☕ CURRENTDATA(NO)

Ajuda em consultas read-only.


🔥 ISOLATION LEVEL

NívelCaracterística
URmais rápido
CScomum
RSconsistente
RRmáximo lock

🚨 RR é perigoso

Repeatable Read

Pode prender milhares de locks.


☕ Comandos úteis

Ver locks

-DISPLAY DATABASE(*) LOCKS

Threads travadas

-DISPLAY THREAD(*)

🔥 O SEGREDO QUE TODO DBA MAINFRAME APRENDE

A maioria dos problemas NÃO é resolvida aumentando hardware.

O fluxo correto é:

1. SQL
2. Índice
3. RUNSTATS
4. Access Path
5. Buffer Pool
6. Sort
7. Locking
8. Só depois pensar em CPU

☕ A FILOSOFIA DO DB2 z/OS

O DB2 é como uma megacidade subterrânea.

Cada:

  • página

  • lock

  • RID

  • sort

  • getpage

é trânsito acontecendo em tempo real.

E o DBA/Sysprog experiente aprende uma coisa:

🔥 “Performance não é força bruta.
É arquitetura inteligente.” 💾🚀

 

sábado, 9 de maio de 2026

🔥☕ “O MAINFRAME NÃO ESTÁ LENTO — SEU SQL É QUE ESTÁ INCENDIANDO A CPU DO IBM Z” 💾🚨

 

Bellacosa Mainframe mergulhando em performance e custo de query db2 no Mainframe

🔥☕ “O MAINFRAME NÃO ESTÁ LENTO — SEU SQL É QUE ESTÁ INCENDIANDO A CPU DO IBM Z” 💾🚨

A Verdade Brutal que Todo Sysprog Júnior Descobre Quando Entra no Mundo Real do DB2 for z/OS

Por Bellacosa Mainframe


Existe um momento na vida de todo sysprog júnior…

aquele instante mágico, traumático e inesquecível…

quando ele percebe que:

💣 O problema não era o CICS.

💣 Não era o z/OS.

💣 Não era o storage.

💣 Nem o “mainframe velho”.

Era um único SQL.

Sim.

Uma linha aparentemente inocente:

SELECT *
FROM CLIENTES
WHERE CPF = '12345678900'

…destruindo CPU, queimando MIPS, elevando MSU, congestionando buffer pool e transformando a LPAR num inferno termonuclear digital.

Bem-vindo ao mundo real do DB2 for z/OS.


☕ O DIA EM QUE O PADAWAN DESCOBRE QUE CPU NO MAINFRAME = DINHEIRO

No universo distribuído moderno, quando falta performance, a resposta costuma ser:

  • sobe mais VM

  • coloca Kubernetes

  • aumenta cluster

  • escala horizontalmente

No mainframe?

HAHAHAHA.

Aqui a conversa é outra.

Aqui:

CPU = LICENSING

CPU = MLC

CPU = 4HRA

CPU = FATURA MILIONÁRIA

Um SQL ruim não deixa apenas o sistema “mais lento”.

Ele:

  • aumenta custo mensal

  • afeta SLA

  • derruba throughput

  • impacta batch

  • congestiona CICS

  • aumenta I/O

  • cria lock contention

  • vira incidente de produção

E o mais assustador?

Muitas vezes tudo começa com um programador dizendo:

“Mas é só um SELECT…”


🏛️ O MAINFRAME NÃO PENSA COMO VOCÊ

O sysprog júnior normalmente imagina que o DB2 executa SQL exatamente como foi escrito.

Não.

O DB2 é muito mais sofisticado.

Quando você envia um SQL, o DB2 chama uma entidade quase mística:

🔥 O OPTIMIZER

Ele analisa:

  • estatísticas

  • cardinalidade

  • índices

  • distribuição de dados

  • filtros

  • joins

  • sort

  • predicates

  • paralelismo

  • buffer access

E então decide:

“Qual será o caminho menos custoso para encontrar esses dados?”

Esse caminho se chama:

☕ ACCESS PATH

E é aqui que nascem:

  • os heróis

  • os vilões

  • os incêndios de CPU

  • e os DBA traumatizados.


💣 O TABLESPACE SCAN — O DEMÔNIO QUE ASSOMBRA PRODUÇÃO

Imagine uma tabela com:

  • 900 milhões de linhas

  • 14 TB

  • milhões de acessos diários

Agora imagine um SQL sem índice adequado:

SELECT *
FROM CLIENTES
WHERE CPF = '12345678900'

Sem índice…

o DB2 pode precisar ler:

  • página por página

  • bloco por bloco

  • segmento por segmento

Isso se chama:

🚨 TABLESPACE SCAN

Ou seja:

o DB2 sai varrendo o oceano inteiro para encontrar um peixinho.

Resultado:

  • GETPAGE explode

  • CPU dispara

  • synchronous I/O aumenta

  • elapsed cresce

  • batch atrasa

  • CICS sofre

E o sysprog júnior começa a ouvir palavras assustadoras no war room:

  • “buffer pool saturation”

  • “RID failure”

  • “class 2 CPU”

  • “dynamic statement cache”

  • “DSNZPARM”

  • “DSNDB07 lotado”


☕ O PODER SOBRENATURAL DE UM ÍNDICE

Agora veja a mesma consulta com índice:

CREATE INDEX IXCPF
ON CLIENTES (CPF)

O cenário muda completamente.

Agora o DB2:

  • acessa diretamente o valor

  • evita scan massivo

  • reduz GETPAGE

  • diminui I/O

  • baixa CPU

O que levava:

  • 40 minutos

passa a levar:

  • 2 segundos

Sem exagero.

No mundo IBM Z isso acontece TODOS OS DIAS.


🔥 O ERRO MAIS COMUM DOS PROGRAMADORES COBOL

Padawan…

grave isso na alma:

“O COBOL não mata CPU sozinho.”

“O SQL dentro dele mata.”

Um clássico infernal:

PERFORM VARYING WS-I FROM 1 BY 1
   EXEC SQL
      SELECT ...
   END-EXEC
END-PERFORM

Parabéns.

Você acabou de criar:

☠️ O APOCALIPSE DO ROW-BY-ROW PROCESSING

Também conhecido como:

  • slow by slow

  • chatty SQL

  • cursor abuse

O programa funciona.

Mas em produção:

  • executa milhões de SQLs

  • congestiona DB2

  • aumenta context switch

  • explode CPU

O júnior acha:

“Funcionou no teste.”

O veterano olha e já sente dor física.


🧠 O MITO DO “SELECT *”

Outra heresia clássica:

SELECT *

Isso é praticamente um ritual proibido em ambientes críticos.

Porque talvez você precise:

  • 2 colunas

Mas o DB2 entrega:

  • 180 colunas

  • LOBs

  • dados inúteis

  • mais I/O

  • mais buffer

  • mais sort

  • mais CPU

O correto:

SELECT NOME, CPF

No mainframe:

eficiência é religião.


☕ RUNSTATS — O ALIMENTO DO OPTIMIZER

O optimizer do DB2 depende de estatísticas.

Sem elas:

ele fica cego.

RUNSTATS informa:

  • quantidade de linhas

  • distribuição

  • cardinalidade

  • clustering

  • seletividade

Sem RUNSTATS atualizada…

o DB2 toma decisões absurdas.

Exemplo real:

Tabela cresceu de:

  • 10 milhões
    para

  • 800 milhões linhas

Mas estatística continua antiga.

O optimizer acredita que a tabela ainda é pequena.

Escolhe nested loop inadequado.

Resultado:

💣 CPU 100x maior


🔥 EXPLAIN — O RAIO-X DA ALMA DO SQL

Veterano de DB2 não confia em “achismo”.

Ele usa:

EXPLAIN PLAN

Porque EXPLAIN revela:

  • índice usado

  • join method

  • scans

  • sorts

  • custo estimado

  • stage 1 / stage 2

  • parallelism

É literalmente:

a anatomia do pensamento do DB2.


☕ STAGE 2 — O CEMITÉRIO DA INDEXABILITY

Veja isso:

WHERE SUBSTR(NOME,1,3) = 'MAR'

Parece elegante.

Mas pode impedir uso eficiente de índice.

Outro clássico:

WHERE YEAR(DATA) = 2025

Muito bonito.

Muito moderno.

Muito destrutivo.

Melhor:

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

Porque agora:

  • o índice pode respirar

  • o optimizer consegue navegar melhor


🔥 GETPAGE — A PALAVRA QUE FAZ DBA SUAR FRIO

No DB2 z/OS:

GETPAGE = acesso à página de dados.

Muito GETPAGE:

  • mais CPU

  • mais latch

  • mais memória

  • mais I/O

Veteranos monitoram:

  • GETPAGE

  • sync read

  • class 1

  • class 2

  • lock wait

  • RID list

como cardiologista monitorando ECG.


☕ “RÁPIDO” NÃO SIGNIFICA “BARATO”

Essa é uma das maiores lições do mainframe.

Às vezes:

  • elapsed time está ótimo

MAS:

  • CPU está monstruosa.

O usuário acha:

“Nossa, ficou rápido!”

O financeiro vê:

💸🔥💸🔥💸🔥

Porque no IBM Z:

CPU custa dinheiro real.


🤖 A ERA DA IA NO TUNING DB2

Hoje ferramentas modernas analisam:

  • SQLs problemáticos

  • regressão de access path

  • mudanças após REBIND

  • índices ausentes

  • scans perigosos

  • CPU anomalies

E algumas usam IA para:

  • prever degradação

  • sugerir rewrite

  • detectar padrões tóxicos

  • identificar SQLs assassinos

O futuro do tuning DB2 já começou.


🏛️ O QUE O SYSprog JÚNIOR PRECISA ENTENDER URGENTEMENTE

Mainframe não é:

  • “computador velho”

  • “COBOL antigo”

  • “legado ultrapassado”

Mainframe é:

engenharia extrema de throughput.

E DB2 for z/OS é:

um dos motores transacionais mais eficientes já criados pela humanidade.

Ele processa:

  • bancos

  • cartões

  • bolsa

  • aviação

  • seguros

  • governo

  • PIX

  • ATM

  • clearing financeira

Em escala absurda.


☕ A GRANDE VERDADE FINAL

O mundo moderno fala:

  • cloud

  • containers

  • microservices

  • IA

Mas nos bastidores…

existe um IBM Z executando milhões de transações por segundo…

e um DBA desesperado tentando descobrir:

🔥 “QUAL SQL ESTÁ QUEIMANDO A CPU?” 🔥

Porque no fim…

o COBOL processa o negócio…

o CICS coordena as transações…

mas:

💾 É O ACCESS PATH DO DB2 QUE DECIDE QUANTO CUSTA MANTER O MUNDO FUNCIONANDO. ☕🔥

sexta-feira, 23 de janeiro de 2026

💥 DB2 - CENÁRIO: CPU EXPLODINDO EM PRODUÇÃO

 

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:

  1. Sem índice em C.CIDADE
  2. Join usando nested loop pesado
  3. Alto volume de leitura
  4. 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étricaAntesDepois
CPU🔥 Alto⚡ Baixo
Tempo🐢 Lento🚀 Rápido
I/OAltoReduzido

💣 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

sábado, 29 de novembro de 2025

💣🔥 10 MIL SEGUNDOS ROUBADOS POR DIA: O ASSASSINO SILENCIOSO DO SEU MAINFRAME

 

Bellacosa Mainframe falando sobre performance e custo de processamento

💣🔥 10 MIL SEGUNDOS ROUBADOS POR DIA: O ASSASSINO SILENCIOSO DO SEU MAINFRAME 🔥💣

Por que cada milissegundo no z/OS pode ser a diferença entre lucro e caos


🧠 Performance na veia, sem anestesia

No mundo do processamento de transações em alto volume, “rápido o suficiente” é uma mentira confortável.

Quando você roda milhões (ou bilhões) de transações por dia em um ambiente como z/OS, qualquer ineficiência — mesmo microscópica — vira um monstro financeiro.

Não importa se você escreve em COBOL, PL/I ou Java.
Se o seu código desperdiça tempo, o mainframe cobra — e cobra caro.

👉 Performance tuning não é “nice to have”.
👉 É sobrevivência corporativa.


⚙️ O Efeito Multiplicador (ou: como 10ms viram uma conta absurda)

Vamos ao ponto crítico:

Você otimiza um trecho e economiza 10 milissegundos.

Agora multiplica isso:

  • 1.000.000 execuções por dia
  • Resultado:
    👉 10.000 segundos economizados/dia (~2h46min de CPU)

Agora entra o mundo real:

  • Menos CPU → menos consumo de MSU
  • Menos MSU → menor custo de licenciamento
  • Menos contenção → mais throughput
  • Mais throughput → mais negócio rodando

💣 Resumo estilo Bellacosa:

“Você não economizou milissegundos… você salvou dinheiro REAL.”


🧨 Onde isso explode na prática

💥 Cenário clássico (batch assassino)

Um JOB COBOL com loop:

PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 1000000
EXEC SQL
SELECT * INTO :HOST-VAR
FROM CLIENTES
WHERE ID = :WS-I
END-EXEC
END-PERFORM

💀 Problemas:

  • SELECT * (crime hediondo)
  • 1 milhão de chamadas SQL
  • Possível table scan

🔧 Cirurgia de performance (passo a passo)

1️⃣ Reduzir dados (SQL cirúrgico)

SELECT NOME, STATUS
FROM CLIENTES
WHERE ID = ?

✔ Menos I/O
✔ Menos CPU
✔ Menos transporte de dados


2️⃣ Garantir acesso via índice

Use EXPLAIN no DB2:

  • Evite:
    • TABLE SCAN 😱
  • Busque:
    • INDEX SEEK 😎

3️⃣ Trocar loop por processamento em bloco

💡 Em vez de 1 milhão de SELECTs:

  • Use cursor
  • Ou fetch em lote

4️⃣ Buffer Pool tuning (ouro puro)

Se seu dado é acessado frequentemente:

  • Ajuste buffer pools
  • Evite I/O físico

💣 Easter Egg:

Em muitos ambientes, só ajustar buffer pool já deu ganho de 30%+ sem mexer em uma linha de código.


🚀 Quick Wins que parecem pequenos… mas NÃO são

🧩 1. SQL eficiente

  • Nunca use SELECT *
  • Sempre valide acesso via índice
  • Use EXPLAIN como religião

⚡ 2. Compiler moderno (COBOL v6+)

Se você ainda usa compilador antigo:

💀 Você está ignorando otimizações do hardware moderno

Ganhos comuns:

  • Melhor uso de CPU
  • Otimização automática de loops
  • Instruções mais eficientes

💾 3. Movimento de dados (I/O mata performance)

Regra de ouro:

“Disco é lento. Memória é rei.”

Faça:

  • Cache inteligente
  • Sort interno (quando adequado)
  • Evite leituras repetidas

🧠 Curiosidade de guerra (história real de bastidor)

Em um banco:

  • Um único SELECT mal indexado
  • Executado milhões de vezes/dia

Resultado após correção:

👉 Redução de MSU suficiente para economizar dezenas de milhares por mês

💣 O código tinha 10 anos em produção
💣 Ninguém questionava
💣 Até alguém olhar com lupa


🔍 Análise profunda (nível arquiteto)

Performance no mainframe não é só código.

É um ecossistema:

  • CPU (MIPS/MSU)
  • I/O (disco vs memória)
  • Locking (DB2)
  • Concorrência (CICS)
  • Batch window

👉 Uma otimização local pode gerar ganho global
👉 Ou causar efeito colateral (cuidado!)


🧨 Anti-patterns que destroem performance

  • SELECT *
  • Loop com SQL dentro
  • Falta de índice
  • Reprocessamento de dados
  • Leitura repetida de VSAM/DB2
  • Uso de compilador legado

🏆 O verdadeiro “modernizar o mainframe”

Não é só:

  • API
  • Cloud
  • Microservices

💣 Isso é maquiagem se o core estiver ineficiente

Modernizar de verdade é:

✔ Código otimizado
✔ Banco bem indexado
✔ CPU bem utilizada
✔ I/O sob controle


🔥 Conclusão (estilo Bellacosa raiz)

“Mainframe não é lento.
Código ruim é.”

Um sistema bem ajustado não é só estável —
👉 Ele vira vantagem competitiva.


🛠️ Provocação final

Qual foi aquele “fix ridiculamente simples” que você fez e:

  • Derrubou consumo de CPU?
  • Salvou batch window?
  • Ou evitou um caos em produção?

Se cavar… todo ambiente tem um “vilão escondido” esperando alguém enxergar.

E quando você acha…

💣 o ganho vem em escala industrial.


quinta-feira, 7 de março de 2024

Mr. Spock Entra no CPD — O Dia em que o Programador COBOL Disse “É Só um SELECT” e Descobriu uma Civilização Inteira Dentro do Db2

 

Bellacosa Mainframe por dentro do Db2

☕ Um Café no Bellacosa Mainframe

Mr. Spock Entra no CPD — O Dia em que o Programador COBOL Disse “É Só um SELECT” e Descobriu uma Civilização Inteira Dentro do Db2

Ou: por que Buffer Pool, IRLM, DDF, Catalog, Directory, Logs, RUNSTATS, Package, RACF, WLM e Parallel Sysplex fazem parte da mesma missão — e por que dizer que Db2 é “apenas um banco de dados” seria, segundo Spock, altamente ilógico

O turno da noite estava tranquilo.

Tranquilo demais.

E todo profissional de mainframe com alguma estrada sabe que essa frase normalmente é seguida por algum desastre.

O monitor do CICS estava verde. O JES2 aparentemente não tinha nada contra a humanidade naquele momento. O RACF não estava distribuindo ICH408I como panfleto em estação de metrô e nenhum operador havia entrado correndo no CPD gritando:

— A PRODUÇÃO PAROU!

Era quase suspeito.

O jovem programador COBOL, ainda naquela fase da carreira em que acreditamos que um programa que compilou também necessariamente funciona, olhou para sua rotina e anunciou:

EXEC SQL
   SELECT NOME,
          SALDO
     INTO :WS-NOME,
          :WS-SALDO
     FROM CLIENTE
    WHERE CONTA = :WS-CONTA
END-EXEC.

Ele sorriu.

— Pronto. É só um SELECT.

Uma sobrancelha levantou-se no outro lado da sala.

Mr. Spock havia entrado no CPD.

Ninguém soube explicar como um oficial científico da Frota Estelar havia conseguido autorização RACF, crachá temporário e acesso à área restrita do datacenter. Mas considerando que o pessoal de infraestrutura já havia liberado consultores externos com justificativas muito piores, ninguém perguntou.

Spock examinou o código.

Depois examinou o programador.

— Sua afirmação contém uma simplificação estatisticamente perigosa.

— Como assim?

— Você acredita ter executado um SELECT. Na realidade, iniciou uma sequência de eventos envolvendo processamento SQL, gerenciamento de memória, otimização, concorrência, storage, catálogo, controle transacional, autorização e possivelmente comunicação distribuída.

O programador ficou olhando para ele.

— Mas voltou um saldo.

— Exatamente. E esta é a parte fascinante.

Assim começa nossa viagem pela arquitetura do Db2 for z/OS.



1. Primeiro diagnóstico de Spock: Db2 não é uma caixa preta

Para muita gente que começa no COBOL, Db2 parece funcionar assim:

COBOL
  ↓
SQL
  ↓
Db2
  ↓
dados

É confortável.

Também está incompleto.

Uma representação mais próxima da realidade seria algo como:

Programa COBOL
      ↓
CICS / Batch / DDF
      ↓
Thread Db2
      ↓
Package
      ↓
Access Path
      ↓
DBM1
      ↓
Buffer Pools
      ↓
Table Space / Index Space
      ↓
DFSMS / Storage

Enquanto isso, paralelamente:

IRLM → locking
Logs → recovery
RACF → segurança
WLM → prioridade
Catalog → metadados
DDF → acesso distribuído

Spock provavelmente resumiria:

“A simplicidade percebida pelo programador é consequência da complexidade absorvida pela infraestrutura.”

E isso é um dos maiores triunfos do mainframe.



2. O que é um Db2 Subsystem?

Vamos começar pela porta da nave.

No z/OS, frequentemente trabalhamos com um Db2 subsystem.

Ele representa uma instância operacional do Db2 dentro daquele ambiente.

Uma empresa poderia ter algo como:

DB2D → desenvolvimento
DB2T → testes
DB2H → homologação
DB2P → produção

Os nomes variam conforme a instalação.

Não existe mandamento dizendo que produção precisa se chamar DB2P.

Aliás, se existe algo que mainframe ensina rapidamente é:

cada empresa tem suas tradições.

Algumas parecem normas técnicas.

Outras parecem decisões tomadas em 1989 por alguém chamado Geraldo, que se aposentou em 2003 e nunca documentou nada.

Curiosidade do CPD

É muito comum o iniciante dizer:

— Estou conectado no Db2.

O veterano pergunta:

— Qual?

E aí começa a aula.

Um mesmo ambiente pode possuir múltiplos subsystems.

Por isso entender onde seu programa está executando é tão importante quanto entender o que ele executa.



3. DBM1 — a sala de máquinas

No coração da arquitetura encontramos o DBM1, o Database Services Address Space.

É onde ocorre uma quantidade enorme do trabalho relacionado ao banco.

Dentro dessa paisagem aparecem conceitos como:

  • Buffer Pools;

  • EDM Pool;

  • estruturas de processamento;

  • threads;

  • acesso a dados;

  • gerenciamento interno;

  • execução de SQL.

Pense no DBM1 como a engenharia da Enterprise.

Você pode estar sentado confortavelmente na ponte dizendo:

— Warp 5.

Mas alguém lá embaixo precisa fazer o motor funcionar.

No COBOL seria:

EXEC SQL
   SELECT SALDO
     INTO :WS-SALDO
     FROM CONTA
    WHERE NUM_CONTA = :WS-CONTA
END-EXEC.

Do ponto de vista do desenvolvedor:

SELECT → resultado

Do ponto de vista da infraestrutura:

solicitação
→ contexto de execução
→ access path
→ memória
→ índice
→ páginas
→ locking
→ eventualmente I/O
→ retorno

“É só um SELECT” começa a parecer uma frase corajosa.


4. Buffer Pool — o truque que evita transformar cada consulta em uma excursão ao storage

Se existe um conceito que todo programador Db2 deveria entender cedo, é Buffer Pool.

Imagine que você tenha uma tabela com 100 milhões de registros.

O programa procura:

SELECT NOME
FROM CLIENTE
WHERE ID_CLIENTE = 928173;

Fisicamente, os dados estão persistidos em storage.

Se toda consulta tivesse que buscar diretamente no disco, teríamos:

programa
   ↓
Db2
   ↓
storage
   ↓
I/O
   ↓
Db2
   ↓
programa

Constantemente.

A performance seria digna de uma carroça klingon.

O Buffer Pool existe justamente para manter páginas de dados e índices em memória.

              MEMÓRIA

        ┌───────────────────┐
        │    BUFFER POOL    │
        │                   │
        │ páginas de dados  │
        │ páginas de índice │
        └─────────┬─────────┘
                  │
          página ausente?
                  │
              SIM ↓
               STORAGE

Se a página já está em memória, evitamos determinado I/O físico.

Essa diferença pode ser gigantesca.


5. O programador pensa em linha; o Db2 frequentemente pensa em página

Aqui está uma mudança de mentalidade poderosa.

O programador escreve:

WHERE CONTA = 12345

Ele pensa:

“Quero essa linha.”

O Db2 precisa lidar com estruturas de armazenamento organizadas em pages.

Então conceitualmente:

linha solicitada
      ↓
página onde ela está
      ↓
Buffer Pool
      ↓
storage se necessário

Isso explica por que performance de banco não pode ser estudada pensando apenas no SQL textual.

Existem questões envolvendo:

  • número de páginas;

  • organização dos dados;

  • índices;

  • clustering;

  • seletividade;

  • Buffer Pool;

  • I/O;

  • estatísticas.

Spock talvez acrescentasse:

— Confundir linha lógica com armazenamento físico seria ilógico.

O DBA responderia:

— Finalmente alguém me entende.


6. Table Space — onde a tabela mora

Uma tabela Db2 precisa viver em uma estrutura apropriada de armazenamento.

Entra o Table Space.

Podemos visualizar:

DATABASE
   │
   ├── TABLE SPACE
   │      │
   │      └── TABLE
   │
   └── INDEX SPACE
          │
          └── INDEX

Aqui vale uma distinção importante.

Table Space e Index Space não são exatamente a mesma coisa.

A tabela reside no Table Space.

O índice possui sua própria estrutura associada.

Essa diferença aparece bastante quando começamos a estudar:

  • utilities;

  • administração;

  • recovery;

  • reorganização;

  • performance.


7. Índice — o tricorder do Db2

Imagine um arquivo com 20 milhões de clientes.

Você quer:

SELECT *
FROM CLIENTE
WHERE CPF = '12345678900';

Sem um caminho adequado, o Db2 pode precisar examinar uma grande quantidade de dados.

Com um índice apropriado:

CPF procurado
    ↓
ÍNDICE
    ↓
localização das páginas
    ↓
dados

Parece maravilhoso.

E é.

Mas existe uma regra que iniciantes aprendem um pouco depois:

índice não é almoço grátis.

Cada índice pode representar:

  • armazenamento;

  • manutenção;

  • custo em INSERT;

  • custo em UPDATE;

  • custo em DELETE;

  • necessidade de reorganização;

  • estatísticas;

  • complexidade adicional.

Criar índice para absolutamente tudo seria como equipar cada tripulante da Enterprise com quinze tricorders.

Em algum momento alguém precisa carregar aquilo.


8. O Optimizer — Spock trabalhando dentro do Db2

Talvez nenhum componente mereça mais o título de “Mr. Spock interno” do que o optimizer.

Você escreve:

SELECT C.NOME,
       P.VALOR
FROM CLIENTE C
JOIN PAGAMENTO P
  ON P.ID_CLIENTE = C.ID_CLIENTE
WHERE C.UF = 'SP';

Você disse o que deseja.

Mas existe mais de uma maneira de conseguir aquilo.

O Db2 pode precisar decidir:

  • qual tabela acessar primeiro;

  • qual índice usar;

  • se deve usar índice;

  • método de join;

  • ordem das tabelas;

  • custo estimado;

  • paralelismo;

  • quantidade provável de linhas.

Esse conjunto de decisões produz o chamado access path.

Simplificando:

SQL
 ↓
Optimizer
 ↓
estatísticas
 ↓
custos estimados
 ↓
Access Path
 ↓
execução

É por isso que dois SQLs que entregam exatamente o mesmo resultado podem ter performances completamente diferentes.


9. RUNSTATS — não mande Spock calcular com sensores quebrados

O optimizer precisa tomar decisões.

Mas baseado em quê?

Em informações sobre os objetos e os dados.

Entram aí as statistics.

Imagine esta distribuição:

CLIENTE

SP = 5.000.000
RJ = 2.000.000
MG = 1.500.000
AC =    30.000
RR =    20.000

Agora compare:

WHERE UF = 'SP'

com:

WHERE UF = 'RR'

A seletividade pode ser radicalmente diferente.

O optimizer precisa ter noção disso.

Ferramentas como RUNSTATS ajudam a coletar estatísticas utilizadas nas decisões de otimização.

Metáfora Bellacosa

Imagine Spock calculando a rota até Vulcano.

Mas você fornece um mapa feito antes da construção das últimas cinquenta colônias.

Ele continua sendo brilhante.

Só está usando informação ruim.

Em banco de dados:

optimizer bom + estatística ruim = possibilidade de access path ruim.

Por isso performance não é apenas:

— “Reescreve esse SELECT.”

Às vezes o SQL estava perfeitamente aceitável.

O ambiente é que mudou.


10. EDM Pool — aquilo que não queremos reconstruir a toda hora

Outro componente importante é o EDM Pool — Environmental Descriptor Manager Pool.

Ele mantém estruturas importantes usadas pelo Db2, incluindo informações relacionadas a packages e estruturas de execução.

O conceito pedagógico é simples:

aquilo que custa processamento para construir pode ser vantajoso manter disponível em memória.

Não confunda EDM Pool com Buffer Pool.

O Buffer Pool trabalha fortemente com páginas de dados e índices.

O EDM Pool está associado a outras estruturas internas necessárias à execução.

Mas ambos ilustram uma obsessão saudável de sistemas de alta performance:

evitar trabalho desnecessário.


11. IRLM — ninguém toca nesse registro sem conversar com o segurança

Chegamos ao IRLM — Internal Resource Lock Manager.

O problema que ele ajuda a resolver é clássico.

Imagine:

Programa A

UPDATE CONTA
SET SALDO = 500
WHERE CONTA = 100;

Programa B

simultaneamente:

UPDATE CONTA
SET SALDO = 800
WHERE CONTA = 100;

Quem ganha?

Quem espera?

Quem pode ler?

Em qual momento?

Que isolamento estamos usando?

Sem controle de concorrência, banco de dados financeiro viraria bingo.

O IRLM participa do gerenciamento de locks.

Podemos pensar:

Programa A ─────┐
                ├── IRLM ── recurso
Programa B ─────┘

Locks existem para preservar consistência em ambientes concorrentes.

E ambiente mainframe costuma ser sinônimo de concorrência em escala bastante séria.


12. Deadlock — quando dois oficiais se recusam a sair da porta

Considere:

Programa A tem recurso X
Programa B tem recurso Y

Agora:

A precisa de Y
B precisa de X

Resultado:

A ───── espera por Y
↑                 │
│                 ↓
X espera por ───── B

Temos um deadlock.

Os dois ficariam esperando eternamente se o sistema não identificasse a situação.

O Db2 precisa detectar o problema e selecionar uma unidade de trabalho para ser interrompida.

Dica para COBOL iniciante

Quando ocorrer erro associado a deadlock ou timeout, não trate imediatamente como:

“Db2 caiu.”

Não.

Na maioria das vezes Db2 está vivíssimo.

Talvez vivo até demais.

Está protegendo a consistência contra seus programas.


13. LOCK não é LATCH

Esse é um pequeno easter egg técnico para quando você estiver conversando com alguém mais experiente.

Lock e latch não são sinônimos.

Locks estão fortemente associados ao controle lógico/transacional de concorrência.

Latches são mecanismos internos de serialização mais leves usados para proteger determinadas estruturas internas.

Portanto quando alguém disser:

— Temos contenção.

Pergunte:

— Que tipo?

Você ganhará pelo menos +3 pontos de experiência mainframe.

Talvez até um café.


14. Logs — a caixa-preta da Enterprise

Agora entramos em uma das áreas mais importantes do Db2.

Imagine:

UPDATE CONTA
SET SALDO = SALDO - 100
WHERE NUM_CONTA = 123;

Uma alteração aconteceu.

O sistema precisa ter capacidade de preservar consistência e recuperar-se de falhas.

Por isso existe toda uma arquitetura de logging.

Em uma visão simplificada:

alteração
   ↓
Log Buffer
   ↓
Active Logs
   ↓
Archive Logs

Os logs guardam informações fundamentais para:

  • recovery;

  • rollback;

  • restart;

  • consistência transacional.

Sem logs, um banco corporativo seria praticamente um caderno escrito a lápis durante um terremoto.


15. COMMIT — quatro letras e uma enorme responsabilidade

No COBOL:

EXEC SQL
   UPDATE CONTA
      SET SALDO = :WS-NOVO-SALDO
    WHERE NUM_CONTA = :WS-CONTA
END-EXEC.

EXEC SQL
   COMMIT
END-EXEC.

COMMIT não significa simplesmente:

“terminei.”

Ele marca uma fronteira transacional importante.

Imagine:

UPDATE
INSERT
DELETE
UPDATE
   ↓
COMMIT

A unidade de trabalho foi confirmada.

O gerenciamento correto de commit é particularmente importante em batch.

Por quê?

Imagine processar cinco milhões de registros e só dar COMMIT no final.

Isso pode aumentar:

  • volume de locks;

  • duração de locks;

  • quantidade de trabalho a desfazer;

  • impacto de rollback;

  • pressão operacional.

Por outro lado, dar COMMIT a cada registro também pode ser inadequado.

A frequência de commit deve ser desenhada conscientemente.

Não existe “número mágico universal”.


16. ACID — as quatro leis de Vulcano das transações

O Db2 trabalha sob princípios transacionais tradicionalmente descritos pela sigla ACID.

Atomicity

Ou a unidade de trabalho ocorre adequadamente ou precisamos impedir resultado parcial inconsistente.

Consistency

O banco deve passar de um estado válido para outro.

Isolation

Transações concorrentes precisam coexistir de forma controlada.

Durability

Depois de confirmado, o resultado deve sobreviver conforme as garantias do sistema.

Considere uma transferência:

Conta Kirk  -100
Conta Spock +100

O universo proibido seria:

Conta Kirk  -100

💥 falha

Conta Spock +0

O dinheiro sumiu em algum buraco de minhoca.

O banco central provavelmente não aceitaria “anomalia espaço-temporal” como justificativa.


17. Active Log, Archive Log e a arte de voltar no tempo sem DeLorean

Os Active Logs participam diretamente das operações correntes de logging do Db2.

Com o avanço do processamento, parte dessas informações pode ser arquivada em Archive Logs.

Conceitualmente:

atividade recente
       ↓
Active Logs
       ↓
arquivamento
       ↓
Archive Logs

Essa arquitetura é um dos pilares das capacidades de recovery.

E aqui entra outro personagem importante.


18. IMAGE COPY — a fotografia antes da tempestade

Uma Image Copy funciona como uma cópia utilizada em estratégias de recuperação dos objetos Db2.

Imagine:

00:00
IMAGE COPY
   │
   │ logs
   │ logs
   │ logs
   │
13:42
falha

Dependendo da estratégia e do cenário, combinamos:

IMAGE COPY
+
LOGS
+
procedimento de recovery

para reconstruir o estado necessário.

Isso é muito mais sofisticado do que aquela frase genérica:

“Restauramos o backup.”

Em ambientes grandes, recovery é ciência.


19. Catalog — o cartório galáctico

Imagine que você cria:

CREATE TABLE PLANETA
(
   ID_PLANETA INTEGER,
   NOME       VARCHAR(80),
   QUADRANTE  CHAR(1)
);

Db2 precisa saber:

  • que a tabela existe;

  • quais colunas existem;

  • seus tipos;

  • seus índices;

  • seus relacionamentos;

  • tablespace;

  • authorities;

  • estatísticas;

  • dependências.

Essas informações vivem no universo do Db2 Catalog.

A metáfora é simples:

Os dados são cidadãos.
O Catalog é o cartório.

Quer saber sobre determinado objeto?

Frequentemente você consulta tabelas do catálogo.


20. Directory — o compartimento em que Spock recomenda não mexer sem motivo

Além do Catalog existe o Db2 Directory.

São estruturas internas essenciais ao próprio funcionamento do Db2.

Uma distinção simplificada:

CATALOG
→ metadados administrativos acessíveis

DIRECTORY
→ estruturas internas do próprio Db2

Não trate os dois termos como sinônimos.

É uma daquelas diferenças que parece acadêmica no começo.

Depois você começa a estudar internals e percebe por que existia.


21. DDF — o momento em que o mainframe abre as portas da nave

Db2 for z/OS não serve apenas a COBOL rodando dentro do próprio mainframe.

Aplicações externas podem acessar Db2 utilizando DDF — Distributed Data Facility.

Por exemplo:

Java
Python
.NET
Linux
Windows
Cloud
   │
   ↓
DRDA
   ↓
TCP/IP
   ↓
DDF
   ↓
Db2 for z/OS

Isso destrói outro mito antigo:

“Mainframe é uma ilha.”

Há décadas não é.

O mainframe moderno pode conversar com praticamente o ecossistema corporativo inteiro.


22. DRDA — o diplomata entre mundos relacionais

DRDA — Distributed Relational Database Architecture fornece mecanismos padronizados para acesso distribuído a bancos relacionais.

Você pode imaginar:

Aplicação externa
      ↓
Driver
      ↓
DRDA
      ↓
TCP/IP
      ↓
DDF
      ↓
Db2

Ou seja, aquele programa Java no Kubernetes pode estar consultando informações que no final vivem no Db2 for z/OS.

O desenvolvedor Java talvez nem saiba.

E em muitos casos nem precisa saber.

Mas o arquiteto deveria.


23. COBOL + CICS + Db2 — o triângulo clássico

Agora voltamos à nossa velha sala de produção.

Um caminho clássico:

usuário
   ↓
CICS
   ↓
Programa COBOL
   ↓
SQL
   ↓
Db2

No programa:

EXEC SQL
   SELECT SALDO
     INTO :WS-SALDO
     FROM CONTA
    WHERE NUM_CONTA = :WS-CONTA
END-EXEC.

Parece natural.

Mas como o SQL foi parar dentro daquele programa executável?

Aí vem uma parte fundamental que muitos cursos passam rápido demais.


24. PRECOMPILE — COBOL e SQL precisam conversar

COBOL puro não interpreta nativamente aquele EXEC SQL.

Existe uma etapa de preparação.

De forma tradicional e simplificada:

Fonte COBOL + SQL
        ↓
   PRECOMPILER
      ┌─┴─────────────┐
      ↓               ↓
COBOL modificado     DBRM
      ↓               ↓
Compiler             BIND
      ↓               ↓
Object              Package
      ↓
Link
      ↓
Load Module

O precompiler identifica instruções SQL e prepara os elementos necessários para o processamento posterior.

Esse fluxo explica por que desenvolvimento COBOL + Db2 envolve muito mais que:

compilar
executar

25. DBRM e PACKAGE — o que Spock realmente queria encontrar

O DBRM guarda informações extraídas das instruções SQL durante a preparação.

Posteriormente ocorre o BIND.

O BIND gera estruturas como packages utilizadas pela execução.

Simplificando:

SQL
 ↓
DBRM
 ↓
BIND
 ↓
PACKAGE
 ↓
Access Path

O package é extremamente importante.

Porque o programa COBOL pode continuar exatamente igual enquanto o comportamento do SQL muda por razões relacionadas a:

  • rebind;

  • novas estatísticas;

  • novos índices;

  • alteração do ambiente;

  • manutenção;

  • mudança de release;

  • access path diferente.

Essa é uma das primeiras grandes revelações para quem trabalha com performance.

Código-fonte igual não significa necessariamente comportamento operacional idêntico.


26. BIND — o casamento arranjado entre SQL e Db2

O BIND é uma etapa fundamental da vida do SQL estático.

É quando informações do DBRM são utilizadas para produzir um package.

E ali são tomadas decisões importantíssimas.

Se você aprende apenas a programar:

EXEC SQL ...

mas não aprende:

  • package;

  • bind;

  • rebind;

  • access path;

você aprendeu a dirigir, mas nunca abriu o capô.

Serve.

Até o carro começar a fazer barulho.


27. O verdadeiro caminho de um SELECT

Nosso jovem programador agora olha novamente para:

SELECT SALDO
FROM CONTA
WHERE NUM_CONTA = :WS-CONTA;

Mas depois da aula de Spock ele já enxerga outra coisa:

COBOL
  ↓
CICS
  ↓
Thread Db2
  ↓
Package
  ↓
Access Path
  ↓
Index?
  ↓
Buffer Pool
  ↓
Página disponível?
   ├── SIM → usa memória
   └── NÃO → solicita I/O
                  ↓
                Storage
                  ↓
              Buffer Pool
                  ↓
                 Db2
                  ↓
                COBOL

Aquela linha de SQL agora parece uma missão espacial inteira.

E é exatamente essa mudança de percepção que diferencia alguém que apenas escreve SQL de alguém que começa a compreender o Db2.


28. DFSMS — quando descobrimos que storage também faz parte do banco

Db2 não administra storage em um vácuo.

No z/OS existe integração com o universo do DFSMS — Data Facility Storage Management Subsystem.

Entram conceitos como:

  • datasets;

  • volumes;

  • storage classes;

  • management classes;

  • data classes;

  • políticas SMS;

  • VSAM.

Esse ponto é profundamente “mainframe”.

Em plataformas mais simples, desenvolvedor e banco às vezes parecem universos separados do storage.

No z/OS, você começa a perceber que:

banco
+
storage
+
sistema operacional
+
segurança
+
workload management

formam uma arquitetura integrada.


29. E então aparece VSAM escondido atrás da cortina

Essa curiosidade normalmente surpreende o iniciante.

Db2 for z/OS utiliza infraestrutura de armazenamento associada ao ecossistema VSAM para seus datasets.

Então podemos desenhar:

Db2 object
   ↓
Table Space
   ↓
datasets
   ↓
VSAM / DFSMS
   ↓
storage

Mas atenção:

Isso NÃO significa que Db2 seja simplesmente “um VSAM com SQL”.

Db2 acrescenta um universo inteiro:

  • modelo relacional;

  • SQL;

  • optimizer;

  • locking;

  • logging;

  • recovery;

  • catálogo;

  • integridade;

  • transações.

VSAM e Db2 possuem propósitos e abstrações diferentes.


30. RACF — nem Spock acessa folha de pagamento sem autorização

Agora imagine:

SELECT *
FROM FOLHA_PAGAMENTO;

Tecnicamente válido.

Mas deveria qualquer programa poder executá-lo?

Claro que não.

Entram mecanismos de segurança do ambiente, incluindo integração com RACF e os mecanismos de autorização do próprio Db2.

A regra fundamental:

SQL válido
≠
SQL autorizado

E ainda bem.

Imagine um estagiário descobrindo:

SELECT *
FROM SALARIOS_DIRETORIA;

e dizendo:

— Funcionou no desenvolvimento.

Produção:

ICH408I

O RACF entra em cena como o segurança vulcano:

— Seu entusiasmo não constitui autorização.


31. WLM — todos são iguais, mas alguns workloads precisam responder em 100 milissegundos

Outro componente importante do ecossistema é o WLM — Workload Manager.

O z/OS pode administrar workloads conforme objetivos definidos.

Imagine simultaneamente:

Transação PIX
Consulta de saldo
Batch de faturamento
Relatório gerencial
Backup
Compilação
Job de teste

Todos querem CPU.

Todos acham que são importantes.

Alguns realmente são.

WLM ajuda o sistema a priorizar recursos conforme políticas de serviço.

Pense nele como o oficial de operações da ponte:

“Essa transação é crítica.”
“Esse relatório pode esperar.”
“Esse batch precisa terminar antes das 06:00.”

É uma das grandes razões pelas quais mainframes conseguem misturar workloads muito distintos de forma eficiente.


32. MQ, CICS, TCP/IP e companhia — Db2 nunca esteve sozinho

Observe uma arquitetura corporativa típica:

Mobile
  ↓
API
  ↓
z/OS Connect
  ↓
CICS
  ↓
COBOL
  ↓
Db2

Ao lado:

COBOL
  ↓
MQ
  ↓
sistema externo

Com:

RACF → segurança
WLM  → prioridades
DFSMS → storage
TCP/IP → comunicação
JES → batch

O segredo do mainframe nunca foi um único produto.

É a integração.

Isso vale para Db2 também.


33. Parallel Sysplex — quando uma Enterprise deixa de ser suficiente

Agora entramos em território mais avançado.

Em ambientes de altíssima disponibilidade, Db2 pode operar em configuração de Data Sharing, dentro do universo do Parallel Sysplex.

Imagine:

            Aplicações
                │
      ┌─────────┼─────────┐
      ↓         ↓         ↓
    DB2A      DB2B      DB2C
      │         │         │
      └─────────┼─────────┘
                ↓
      dados compartilhados

Vários membros Db2 podem trabalhar cooperativamente.

Isso proporciona benefícios associados a:

  • disponibilidade;

  • escalabilidade;

  • flexibilidade operacional;

  • continuidade.

Mas surge um problema lógico.

Se DB2A e DB2B acessam os mesmos dados:

Como garantir coerência?

Excelente pergunta, jovem cadete.


34. Coupling Facility e Group Buffer Pool

No Data Sharing entram estruturas disponibilizadas através da Coupling Facility.

Entre elas aparecem mecanismos relacionados a Group Buffer Pools e coordenação entre membros.

Simplificando:

DB2A                     DB2B
 │                         │
Buffer Pool            Buffer Pool
 │                         │
 └──────────┐   ┌──────────┘
            ↓   ↓
      Coupling Facility
            │
      Group Buffer Pool

Se vários membros acessam os mesmos dados, precisamos impedir que cada um viva numa realidade alternativa.

Afinal, nem Star Trek resolve consistência eventual com universo paralelo em folha de pagamento.


35. O programa funciona, mas está lento. E agora?

Este é um dos momentos mais importantes da carreira.

Iniciante:

“O SQL está lento.”

Profissional experiente:

“Vamos descobrir por quê.”

Possibilidades:

SQL ruim
estatísticas inadequadas
índice ausente
índice inadequado
access path diferente
muito I/O
Buffer Pool pressionado
contenção
locks
volume de dados cresceu
commit inadequado
CPU
storage
DDF
rede
WLM

Percebe a diferença?

Performance não é adivinhação.

É investigação.

Mr. Spock aprovaria.


36. Checklist Bellacosa para o COBOL iniciante

Quando um SQL apresentar problema, pergunte nesta ordem aproximada:

  1. O SQL está logicamente correto?

  2. Quantas linhas deveriam retornar?

  3. Quantas realmente retornam?

  4. Existe índice apropriado?

  5. Qual access path está sendo usado?

  6. As estatísticas estão atualizadas?

  7. Houve REBIND recentemente?

  8. O volume de dados mudou?

  9. Existe contenção?

  10. Existe timeout ou deadlock?

  11. O programa está dando commits adequadamente?

  12. O problema acontece sempre ou apenas em horários específicos?

  13. É batch, CICS ou acesso distribuído?

  14. Existe pressão de CPU ou I/O?

  15. Houve mudança no ambiente?

Já percebeu que:

“Está lento porque Db2 está lento”

é praticamente uma não-explicação.


37. O easter egg do SQLCODE

Todo programador COBOL conhece algum momento assim:

IF SQLCODE NOT = 0
    DISPLAY 'ERRO DB2'
END-IF

Spock vê isso.

Fica silencioso durante oito segundos.

Depois diz:

— Fascinante. Você descartou todas as informações diagnósticas e preservou apenas o fato de que algo ocorreu.

Não seja esse programador.

SQLCODE é começo de diagnóstico.

Não fim.

Considere também as informações disponibilizadas por SQLCA e mecanismos apropriados de diagnóstico.

A mensagem:

ERRO DB2

é quase equivalente a chamar a manutenção dizendo:

“A máquina não está normal.”

Boa sorte.


38. Segundo easter egg: SELECT *

Spock observa:

SELECT *
FROM CLIENTE;

— Por que você deseja todas as colunas?

— Porque é mais fácil.

— Essa justificativa não parece relacionada à necessidade funcional.

Silêncio.

SELECT * pode ser conveniente em testes.

Em aplicação profissional, pense nas colunas realmente necessárias.

Isso melhora:

  • clareza;

  • manutenção;

  • previsibilidade;

  • potencialmente movimentação de dados;

  • dependências.

Escreva o que precisa.

Não o que seus dedos acharam mais curto.


39. Terceiro easter egg: COMMIT dentro do loop sem pensar

Outro clássico:

PERFORM UNTIL EOF
   ...
   EXEC SQL
      UPDATE ...
   END-EXEC

   EXEC SQL
      COMMIT
   END-EXEC
END-PERFORM

Talvez seja correto.

Talvez seja horrível.

Depende.

A pergunta certa não é:

“Posso dar COMMIT aqui?”

É:

“Qual unidade de trabalho faz sentido para esse processo?”

Em batch, estratégia de commit precisa considerar:

  • restart;

  • volume;

  • locking;

  • recuperação;

  • consistência;

  • desempenho.


40. A diferença entre saber SQL e saber Db2

Este talvez seja o ponto mais importante do artigo.

Conhecer:

SELECT
INSERT
UPDATE
DELETE
JOIN
GROUP BY

é conhecer SQL.

Essencial.

Mas conhecer Db2 for z/OS envolve também:

Subsystem
DBM1
MSTR
IRLM
DDF
Buffer Pool
EDM Pool
Table Space
Index Space
Catalog
Directory
Package
DBRM
BIND
Access Path
RUNSTATS
Logs
Recovery
Image Copy
DFSMS
RACF
WLM
Data Sharing
Parallel Sysplex

É outro nível de entendimento.

E você não precisa aprender tudo no primeiro mês.

Apenas precisa saber que essas camadas existem.


41. Um caminho de estudo em sete missões

Se eu estivesse orientando um programador COBOL iniciante, faria assim.

Missão 1 — SQL

Aprenda bem:

SELECT
INSERT
UPDATE
DELETE
JOIN
CURSOR
NULL
SQLCODE

Missão 2 — COBOL + Db2

Entenda:

host variables
SQLCA
cursor
commit
rollback

Missão 3 — preparação

Estude:

Precompile
DBRM
Bind
Package
Plan

Missão 4 — armazenamento

Estude:

Table Space
Index
Page
Buffer Pool

Missão 5 — optimizer

Estude:

Access Path
RUNSTATS
EXPLAIN
seletividade
cardinalidade

Missão 6 — concorrência

Estude:

Lock
Timeout
Deadlock
Isolation
Commit

Missão 7 — arquitetura z/OS

Finalmente:

IRLM
DDF
DFSMS
RACF
WLM
Logs
Recovery
Data Sharing

Quando terminar isso, volte à Missão 1.

Você descobrirá que seu antigo SELECT mudou completamente.


42. A grande revelação

Nosso programador volta finalmente ao código:

EXEC SQL
   SELECT NOME,
          SALDO
     INTO :WS-NOME,
          :WS-SALDO
     FROM CLIENTE
    WHERE CONTA = :WS-CONTA
END-EXEC.

Antes ele via:

“Busca o saldo.”

Agora enxerga:

Aplicação
 ↓
contexto Db2
 ↓
Package
 ↓
Access Path
 ↓
Optimizer
 ↓
Statistics
 ↓
Index
 ↓
Buffer Pool
 ↓
Page
 ↓
possível I/O
 ↓
Storage
 ↓
controle transacional
 ↓
segurança
 ↓
resultado

Ele olha para Spock.

— Então nunca foi “só um SELECT”.

Spock responde:

— Correto.

— E tudo isso acontece para devolver duas colunas?

— Correto.

— Isso é completamente insano.

Spock levanta novamente a sobrancelha.

— Eu escolheria a palavra “engenharia”.


Epílogo — Vida longa ao Db2

Existe uma tendência natural de ensinar mainframe de fora para dentro.

Primeiro mostramos:

IDENTIFICATION DIVISION.

Depois:

EXEC SQL.

Depois CICS.

Depois JCL.

Está correto.

O problema é quando o aprendizado para ali.

Um profissional começa realmente a amadurecer quando pergunta:

O que existe atrás dessa instrução?

Db2 é um ótimo exemplo.

Por trás do humilde:

SELECT SALDO

existe uma arquitetura desenhada para funcionar em ambientes nos quais:

  • milhões de transações podem acontecer;

  • múltiplas aplicações disputam recursos;

  • dados precisam permanecer consistentes;

  • falhas precisam ser recuperáveis;

  • workloads críticos têm prioridade;

  • segurança precisa ser auditável;

  • sistemas externos precisam acessar dados;

  • operações precisam continuar durante enormes cargas.

É por isso que Db2 for z/OS não deve ser estudado apenas como linguagem SQL.

Ele deve ser entendido como parte de uma arquitetura transacional completa.

Buffer Pool ensina que memória é estratégia.

IRLM ensina que concorrência precisa de disciplina.

RUNSTATS ensina que inteligência depende de boas informações.

Logs ensinam que sobreviver ao desastre é tão importante quanto evitar o desastre.

RACF ensina que capacidade técnica não significa autorização.

WLM ensina que nem todo trabalho possui a mesma urgência.

DDF ensina que mainframe não é uma ilha.

Parallel Sysplex ensina que alta disponibilidade é uma arquitetura, não uma frase de marketing.

E o humble COBOL programador aprende finalmente uma verdade que acompanha muita gente durante décadas de carreira:

quanto mais você entende o que existe abaixo do seu programa, melhores ficam as decisões que você toma acima dele.

Spock deixou o CPD pouco antes das três da manhã.

Na saída, encontrou o operador.

— O senhor está indo embora?

— Acredito que meu trabalho aqui terminou.

— E o garoto?

Spock olhou através do vidro para o programador, que naquele momento pesquisava access path, Buffer Pool e RUNSTATS enquanto sua caneca de café esfriava ao lado do terminal.

— Ele cometeu um erro comum.

— Qual?

— Pensou que estava aprendendo apenas COBOL.

Spock fez uma pequena pausa.

— Agora começou a aprender sistemas.

O elevador fechou.

No monitor apareceu:

DSN SYSTEM(...)

Depois:

READY

E em algum lugar profundamente dentro do z/OS, um Buffer Pool continuou recebendo páginas, o IRLM continuou arbitrando recursos, os logs continuaram registrando transações e o velho Db2 fez aquilo que vem fazendo há décadas:

carregar boa parte do mundo corporativo nas costas sem exigir que o usuário saiba quantas maravilhas estavam acontecendo atrás de um simples SELECT.

🖖 Vida longa, prosperidade e um access path decente.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...