☕ 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 Indexes. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Indexes. Mostrar todas as mensagens

sexta-feira, 26 de janeiro de 2024

SQL sem Mistérios : O Guia Definitivo para um Programador COBOL Padawan Entender por que Performance Não Está no SQL — Está na Forma Como o Banco de Dados Pensa

 

Bellacosa Mainframe e o sql sem misterios

☕ Um Café no Bellacosa Mainframe

SQL sem Mistérios

O Guia Definitivo para um Programador COBOL Padawan Entender por que Performance Não Está no SQL — Está na Forma Como o Banco de Dados Pensa

"No IBM Z aprendemos uma lição muito cedo: escrever um programa COBOL correto é apenas metade do trabalho. A outra metade é fazer com que ele execute milhões de vezes por dia consumindo o mínimo possível de CPU, memória, I/O e tempo de resposta. O mesmo vale para SQL. O segredo nunca esteve apenas na consulta. O segredo sempre esteve no plano de execução."


Introdução

Existe uma ideia que acompanha praticamente todo programador iniciante.

"Se meu SQL está correto, ele será rápido."

Infelizmente isso quase nunca é verdade.

Na realidade, dois comandos SQL visualmente parecidos podem apresentar diferenças de desempenho de centenas ou até milhares de vezes.

O curioso é que ambos retornam exatamente o mesmo resultado.

Como isso é possível?

Porque SQL é uma linguagem declarativa.

Você não diz como o banco deve executar.

Você apenas informa o que deseja obter.

Quem decide como chegar ao resultado é o Query Optimizer, talvez um dos componentes mais sofisticados já criados na Engenharia de Software.

É exatamente nesse ponto que muitos desenvolvedores COBOL descobrem uma das maiores diferenças entre programar aplicações e construir sistemas corporativos de missão crítica.

No Mainframe, especialmente no Db2 for z/OS, performance nunca foi um detalhe.

Ela sempre foi parte da regra de negócio.

Um banco que processa milhões de transações por hora não pode desperdiçar CPU apenas porque alguém escreveu um SQL aparentemente "bonito".


A maior mentira sobre SQL

Quando alguém pergunta:

"Como faço um SQL mais rápido?"

A pergunta correta deveria ser:

"Como faço o otimizador escolher um plano de execução melhor?"

Essa pequena mudança muda completamente a forma de pensar.

O SQL é apenas uma descrição lógica.

Quem faz o trabalho pesado é o banco.

Imagine pedir um táxi.

Você informa:

"Quero ir do aeroporto até o hotel."

Você não diz:

  • qual avenida utilizar;

  • qual velocidade manter;

  • qual ponte atravessar;

  • onde abastecer.

Quem decide isso é o motorista.

Com SQL acontece exatamente a mesma coisa.

Você informa o destino.

O banco decide o caminho.

E esse caminho chama-se:

Execution Plan


O verdadeiro inimigo chama-se I/O

Quando começamos em COBOL normalmente pensamos que CPU é o maior problema.

Depois de alguns anos trabalhando em bancos descobrimos outra realidade.

O maior inimigo geralmente é:

DISCO

Mais precisamente:

I/O

Toda vez que o Db2 precisa buscar páginas em disco, existe um custo.

Imagine uma tabela.

CLIENTES

500 milhões de registros

Você deseja apenas:

CPF = 123456789

Existem dois caminhos.

Primeiro.

Ler

500 milhões

↓

encontrar registro

Segundo.

ÍNDICE

↓

posição

↓

registro

A diferença entre essas duas estratégias pode representar minutos versus milissegundos.

É exatamente isso que o otimizador tenta resolver.


O cérebro invisível do banco de dados

Muita gente acredita que o SQL é executado exatamente como foi escrito.

Na realidade acontece algo muito mais interessante.

Primeiro o banco interpreta.

Depois calcula estatísticas.

Depois verifica índices.

Depois estima custos.

Depois compara algoritmos.

Depois escolhe um plano.

Só então executa.

Na prática ele faz algo semelhante a isto:

SQL

↓

Parser

↓

Optimizer

↓

Statistics

↓

Execution Plan

↓

Runtime

Ou seja...

Antes de executar uma única linha, o banco já simulou diversos cenários.

Esse processo acontece milhares de vezes por segundo.


O pensamento de um especialista IBM Z

Existe uma diferença enorme entre um programador iniciante e um especialista.

O iniciante pergunta:

Meu SQL funciona?

O especialista pergunta:

  • Quantos GETPAGEs ele gera?

  • Quantas páginas serão lidas?

  • Qual Buffer Pool será utilizada?

  • Existe Table Scan?

  • O índice é Matching?

  • Existe Sort?

  • O Join utilizará Hash?

  • Há paralelismo?

  • O RUNSTATS está atualizado?

  • Qual é o custo estimado?

Perceba.

A preocupação deixa de ser o SQL.

Ela passa a ser o comportamento interno do banco.


Primeira regra: reduza trabalho

Uma consulta lenta quase sempre faz trabalho demais.

Veja um erro extremamente comum.

SELECT *
FROM CLIENTES;

Parece inofensivo.

Mas imagine a tabela:

CPF

NOME

EMAIL

ENDEREÇO

TELEFONE

FOTO

OBSERVAÇÃO

SCORE

RENDA

LIMITE

NASCIMENTO

Seu programa COBOL utiliza apenas:

CPF

NOME

Então por que pedir todo o restante?

Cada coluna representa:

  • mais páginas;

  • mais memória;

  • mais tráfego;

  • mais CPU.

O primeiro princípio da engenharia de performance é extremamente simples.

Nunca leia aquilo que você não utilizará.


O índice não é mágica

Outro grande mito.

Muitos acreditam que basta criar índices.

Na prática isso pode piorar tudo.

Cada índice precisa ser atualizado em:

INSERT

UPDATE

DELETE

Quanto mais índices,

mais escrita,

mais manutenção,

mais espaço,

mais CPU.

Por isso especialistas projetam índices observando o comportamento das consultas.

Não existe índice perfeito.

Existe índice adequado para determinada carga de trabalho.


O poder dos índices compostos

Imagine este SQL.

WHERE CPF=?

AND STATUS='A'

Qual índice é melhor?

CPF

ou

CPF

STATUS

O segundo.

Porque acompanha exatamente o padrão utilizado pela consulta.

Esse conceito chama-se:

Composite Index.

No Db2 isso pode eliminar milhares de leituras desnecessárias.


Covering Index: quando a tabela deixa de ser necessária

Poucos conceitos impressionam tanto um programador COBOL quanto este.

Imagine:

SELECT NOME
FROM CLIENTES
WHERE CPF=?

Se existir um índice contendo:

CPF

NOME

o Db2 pode responder utilizando apenas o índice.

A tabela sequer será acessada.

Isso reduz:

  • I/O;

  • CPU;

  • tempo de resposta.

É uma das maiores vitórias do otimizador.


SARGable: a palavra que todo Padawan deveria decorar

Ela parece complicada.

Mas a ideia é simples.

Observe.

Errado.

WHERE YEAR(DATA)=2025

Agora o banco precisa calcular YEAR para milhões de linhas.

O índice praticamente perde sua utilidade.

Agora veja.

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

Aqui o índice pode ser percorrido diretamente.

Esse conceito chama-se:

Search Argument Able

ou simplesmente

SARGable.

Sempre que possível, permita que o banco utilize diretamente seus índices.


EXISTS x IN

Outro assunto clássico.

Muitos iniciantes perguntam:

"Qual é mais rápido?"

A resposta correta é:

"Depende."

Mas existe uma tendência.

Em conjuntos muito grandes,

EXISTS costuma interromper a busca assim que encontra a primeira ocorrência.

Já IN pode exigir estratégias diferentes dependendo do plano escolhido.

O importante não é decorar regras.

É analisar o plano.


Filtrar antes de juntar

Imagine duas tabelas.

CLIENTES

120 milhões
PEDIDOS

800 milhões

Sem filtro:

120 milhões

×

800 milhões

Agora imagine aplicar:

STATUS='ATIVO'

antes do JOIN.

Talvez restem apenas:

2 milhões

×

8 milhões

O banco trabalhará muito menos.

Essa simples mudança pode reduzir drasticamente o custo de execução.


DISTINCT é caro

DISTINCT parece elegante.

Mas por trás dele normalmente existe:

SORT

COMPARAÇÃO

ELIMINAÇÃO

MEMÓRIA

CPU

Em muitos projetos ele aparece apenas para esconder um JOIN incorreto.

O especialista não remove duplicidade.

Ele evita produzi-la.


UNION ou UNION ALL?

Outro clássico.

UNION precisa descobrir registros repetidos.

Para isso geralmente ocorre:

SORT

COMPARE

REMOVE

UNION ALL simplesmente concatena.

Tabela A

+

Tabela B

Sem ordenar.

Sem comparar.

Sem remover.

Em processos ETL isso faz enorme diferença.


O plano de execução é o mapa do tesouro

Imagine um médico sem raio-X.

É exatamente isso que faz quem tenta otimizar SQL sem olhar o plano.

No Db2 utilizamos:

  • EXPLAIN

  • PLAN_TABLE

  • Visual Explain

No PostgreSQL:

EXPLAIN ANALYZE

No SQL Server:

Actual Execution Plan

No Oracle:

EXPLAIN PLAN

O plano revela tudo.

Table Scan

Index Scan

Nested Loop

Merge Join

Hash Join

Sort

Temporary

Parallel

Sem ele praticamente toda otimização é tentativa e erro.


O verdadeiro papel do RUNSTATS

Existe uma armadilha muito comum.

O SQL está perfeito.

Os índices existem.

Mesmo assim o desempenho é ruim.

O problema pode estar nas estatísticas.

No Db2, o utilitário RUNSTATS informa ao otimizador:

  • quantidade de linhas;

  • cardinalidade;

  • distribuição dos valores;

  • quantidade de páginas;

  • fator de clusterização;

  • informações sobre índices.

Sem essas estatísticas, o otimizador toma decisões com base em estimativas imprecisas, aumentando a chance de escolher um plano inadequado.


Partition Pruning: lendo apenas o necessário

Imagine uma tabela dividida por ano.

2021

2022

2023

2024

2025

2026

Sua consulta busca apenas 2026.

Se o particionamento for bem utilizado, o banco ignora todas as demais partições.

Em vez de ler bilhões de linhas, lê apenas a fração necessária.

É uma das técnicas mais importantes para bases corporativas de grande porte.


Os algoritmos invisíveis dos JOINs

Quando você escreve:

JOIN

o Db2 ainda precisa decidir como unir as tabelas.

As principais estratégias são:

Nested Loop Join, ideal para poucos registros e bons índices.

Merge Join, eficiente quando os dados já estão ordenados.

Hash Join, excelente para grandes volumes e junções sem índices seletivos.

A escolha depende de estatísticas, cardinalidade e custo estimado. O mesmo SQL pode gerar algoritmos diferentes conforme os dados evoluem.


O que um Padawan COBOL pode aprender com tudo isso?

Existe um paralelo interessante entre COBOL e SQL.

Quando escrevemos um programa COBOL, evitamos ler um arquivo inteiro se conhecemos a chave do registro.

Não percorremos um VSAM KSDS sequencialmente para localizar uma única conta quando podemos usar a chave primária.

Da mesma forma, no Db2 não devemos obrigar o banco a fazer um table scan quando um índice seletivo resolveria o problema com muito menos trabalho.

A lógica é a mesma: reduzir operações desnecessárias e aproveitar as estruturas de acesso disponíveis.


A Filosofia Bellacosa Mainframe

Ao longo de décadas trabalhando com IBM Z, uma lição se repetiu inúmeras vezes.

Os sistemas mais rápidos raramente eram aqueles escritos pelos programadores mais "geniais".

Eram aqueles escritos por profissionais que entendiam como a infraestrutura pensava.

Eles compreendiam que:

  • CPU custa dinheiro.

  • I/O custa tempo.

  • Memória é finita.

  • Locks geram contenção.

  • Sorts desperdiçam recursos.

  • Estatísticas influenciam decisões.

  • Índices precisam de estratégia.

  • Cada GETPAGE representa trabalho.

  • Cada plano de execução conta uma história.

No universo Mainframe, performance nunca foi um luxo. Sempre foi um requisito funcional.


Palavra Final

Se existe uma única mensagem que este artigo pretende deixar para todo Programador COBOL Padawan, é esta:

Você não otimiza apenas uma instrução SQL. Você otimiza a forma como o banco de dados raciocina sobre ela.

Quando você escreve uma consulta, está apenas descrevendo um objetivo. Quem realmente faz o trabalho é o otimizador, escolhendo índices, algoritmos de JOIN, estratégias de acesso, ordenações e caminhos de execução.

Os grandes especialistas em Db2 para IBM Z não decoram truques. Eles estudam estatísticas, analisam planos de execução, compreendem o comportamento do otimizador e medem continuamente CPU, I/O, GETPAGEs, uso de Buffer Pools e contenção. Eles sabem que um ganho de poucos milissegundos por transação pode representar milhões de operações economizadas ao longo de um ano.

Como ensinamos no Bellacosa Mainframe: o SQL é apenas a pergunta; o plano de execução é a resposta do banco. Quando você aprende a ler essa resposta, deixa de ser apenas um programador que escreve consultas e passa a pensar como um verdadeiro engenheiro de software para sistemas de missão crítica.

No fim das contas, o objetivo não é criar um SQL elegante. É construir aplicações capazes de processar milhões de transações com eficiência, previsibilidade e confiabilidade — exatamente como os grandes ambientes IBM Z fazem há décadas. Esse é o verdadeiro caminho para evoluir de Padawan a Mestre na arte da performance em bancos de dados.


sexta-feira, 27 de novembro de 2015

☕🔥 DB2 NO IBM MAINFRAME — OS 9 CONCEITOS DE BANCO DE DADOS QUE SEPARAM CURIOSOS DE ENGENHEIROS CORPORATIVOS

 

Bellacosa Mainframe em 9 conceitos para melhorar a experiencia em db2

☕🔥 DB2 NO IBM MAINFRAME — OS 9 CONCEITOS DE BANCO DE DADOS QUE SEPARAM CURIOSOS DE ENGENHEIROS CORPORATIVOS

Muita gente aprende banco de dados assim:

SELECT * FROM CLIENTES;

E acredita que já “entende SQL”.

Mas no universo IBM Mainframe + DB2…

isso é apenas a porta de entrada.

Porque o DB2 z/OS não foi criado para:

  • apps pequenos

  • tabelinhas simples

  • projetinhos acadêmicos

Ele foi criado para:

🔥 processar o planeta.

Bancos.
PIX.
Cartões.
Seguradoras.
Bolsas financeiras.
Telecom.

E para sobreviver nesse universo…

existem fundamentos que TODO profissional precisa dominar.

Não apenas decorar.

🔥 Entender profundamente.


☕🔥 1. TABLES — AS “CAIXAS-FORTES” DO MUNDO CORPORATIVO

Tudo começa aqui.

TABLES (Tabelas)


☕ O que são?

Estruturas organizadas em:

  • linhas

  • colunas

  • registros


☕ Exemplo simples

CLIENTES

IDNOMEEMAIL
1ALICEalice@email.com

☕ Parece simples…

Mas no DB2 Mainframe uma tabela pode conter:

🔥 bilhões de registros.


☕ E aí surgem preocupações reais:

  • page size

  • clustering

  • partitioning

  • buffer pool

  • compression

  • locking


☕ Bellacosa Mainframe Analysis™

Tabela no DB2 não é “planilha”.

É:

🔥 infraestrutura crítica corporativa.


☕🔥 2. PRIMARY KEY — O “RACF ID” DOS DADOS

Agora entramos numa das bases mais importantes.

PRIMARY KEY


☕ A chave primária identifica unicamente cada linha.


☕ Exemplo

ID_CLIENTE = 1001

Nunca pode duplicar.


☕ Isso garante:

✅ unicidade
✅ integridade
✅ consistência


☕ No Mainframe isso é sagrado

Porque duplicidade em ambiente financeiro pode virar:

🔥 desastre operacional.


☕ Exemplo bancário

Dois clientes com mesma conta?

Impensável.


☕ Bellacosa Mainframe Analysis™

Primary Key é como:

RACF USERID

Identidade única dentro do sistema.


☕🔥 3. FOREIGN KEY — O “CABO DE REDE” ENTRE TABELAS

Agora começamos a construir relacionamentos.

FOREIGN KEY


☕ Ela conecta tabelas.


☕ Exemplo

CLIENTES

ID
1

PEDIDOS

ID_PEDIDOCLIENTE_ID
1001

☕ Isso cria integridade referencial.


☕ Sem isso?

🔥 caos relacional.


☕ O DB2 impede inconsistências como:

  • pedido sem cliente

  • transação órfã

  • referência inválida


☕ Isso é vital no Mainframe

Porque ambientes corporativos precisam de:

🔥 confiabilidade absoluta.


☕🔥 4. INDEXES — O “CATÁLOGO SECRETO” DO DB2

Agora chegamos num dos pontos mais importantes do z/OS.

INDEXES


☕ O índice evita que o DB2 leia tudo.


☕ Sem índice:

TABLE SPACE SCAN

☕ Com índice:

🔥 acesso direcionado.


☕ Bellacosa Mainframe Analysis™

Índice é como:

índice remissivo de enciclopédia

Você vai direto ao ponto.


☕ Exemplo clássico

Buscar CPF sem índice em bilhões de linhas?

🔥 sofrimento puro.


☕ Índices impactam:

  • CPU

  • GETPAGE

  • I/O

  • locks

  • elapsed time


☕ DBA Mainframe vive obcecado por isso.


☕🔥 5. NORMALIZATION — A ARTE DE EVITAR BAGUNÇA CORPORATIVA

Agora entramos em modelagem.

NORMALIZATION


☕ Objetivo:

reduzir redundância.


☕ Exemplo RUIM

CLIENTE
CLIENTE_TELEFONE_1
CLIENTE_TELEFONE_2
CLIENTE_TELEFONE_3

☕ Melhor:

Tabela separada.


☕ Isso melhora:

✅ integridade
✅ manutenção
✅ consistência


☕ Mas existe um detalhe importante

Normalização extrema pode gerar:

🔥 JOINs monstruosos.


☕ E aí nasce o equilíbrio corporativo.


☕🔥 6. SQL QUERIES — A “LINGUAGEM OPERACIONAL” DO PLANETA

Agora chegamos ao coração do DB2.

SQL


☕ SQL não é apenas consulta.

É:

  • leitura

  • escrita

  • atualização

  • análise

  • inteligência corporativa


☕ Exemplo

SELECT NOME, EMAIL
FROM CLIENTES
WHERE IDADE > 18
ORDER BY NOME;

☕ No Mainframe isso envolve:

  • optimizer

  • access path

  • RUNSTATS

  • index usage

  • locking


☕ Query ruim?

🔥 milhões em CPU.


☕ Query boa?

🔥 eficiência absurda.


☕🔥 7. RELATIONSHIPS — O “SYSplex” DOS DADOS

Agora os dados começam a formar ecossistemas.


☕ Tipos clássicos

One-to-One

Uma pessoa → um passaporte.


One-to-Many

Cliente → vários pedidos.


Many-to-Many

Alunos ↔ cursos.


☕ Bellacosa Mainframe Analysis™

Relacionamentos lembram:

🔥 integração entre subsistemas no z/OS.


☕ Porque no fim…

tudo precisa conversar sem perder integridade.


☕🔥 8. TRANSACTIONS — O CORAÇÃO FINANCEIRO DO MAINFRAME

Agora entramos no território sagrado.

TRANSAÇÕES.


☕ Exemplo clássico

BEGIN
 ↓
UPDATE
 ↓
COMMIT

☕ Ou:

ROLLBACK

☕ Isso garante:

🔥 tudo ou nada.


☕ Exemplo bancário

Transferência:

  • debita conta A

  • credita conta B


☕ Se metade falhar?

ROLLBACK.


☕ Isso é ABSOLUTAMENTE CRÍTICO.


☕ Porque o Mainframe não pode “quase funcionar”.


☕🔥 9. ACID — A RELIGIÃO DO DB2

Agora chegamos na base filosófica do banco de dados corporativo.

ACID


☕ A — Atomicity

Tudo acontece…
ou nada acontece.


☕ C — Consistency

Dados permanecem válidos.


☕ I — Isolation

Transações não interferem incorretamente.


☕ D — Durability

Após COMMIT…

🔥 os dados sobrevivem.


☕ Isso é o que permite:

  • bancos globais

  • bolsas financeiras

  • PIX

  • cartões

funcionarem 24x7.


☕ Bellacosa Mainframe Analysis™

ACID é praticamente:

🔥 o “RACF filosófico” do banco de dados.


☕🔥 O OTIMIZADOR — A ENTIDADE MISTERIOSA DO DB2

Pouca gente entende isso profundamente.


☕ O optimizer decide:

  • índice

  • JOIN

  • SORT

  • acesso

  • custo


☕ Baseado em:

  • RUNSTATS

  • cardinalidade

  • histogramas

  • distribuição


☕ Sem estatísticas corretas?

🔥 performance pode morrer.


☕🔥 O QUE O MAINFRAME ENSINA SOBRE BANCO DE DADOS

O mercado moderno frequentemente pensa:

“Banco é armazenamento.”


☕ O Mainframe pensa diferente.

Banco é:

  • engenharia

  • integridade

  • disponibilidade

  • resiliência

  • missão crítica


☕ Porque quando bilhões dependem do sistema…

erro deixa de ser “bug”.

🔥 erro vira crise financeira.


☕🔥 CONCLUSÃO — DB2 NÃO É APENAS BANCO DE DADOS

É um sistema operacional de informações corporativas.

Tables organizam.
Keys identificam.
Indexes aceleram.
Transactions protegem.
ACID sustenta tudo.

E talvez essa seja a maior verdade sobre o IBM Mainframe:

ele não sobreviveu por nostalgia.

🔥 Ele sobreviveu porque poucos ambientes no planeta conseguem proteger dados críticos com tanta eficiência quanto o DB2 z/OS.

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...