Translate

Mostrar mensagens com a etiqueta join. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta join. Mostrar todas as mensagens

sábado, 4 de maio de 2024

🧩 O “Relational Problem”: quando o modelo relacional começa a ranger os dentes

 

Bellacosa Mainframe e o  Relation Problem 

🧩 O “Relational Problem”: quando o modelo relacional começa a ranger os dentes

Teve uma época — lá pelos anos 70 e 80 — em que o modelo relacional era praticamente um presente divino.
Ted Codd apareceu com tabelas, chaves, normalização e alguém pensou:

“Pronto, agora dá pra organizar o mundo inteiro em linhas e colunas.”

E funcionou. Funcionou bem demais.
Funcionou tanto que virou padrão em bancos, governos, ERPs, mainframes, folha de pagamento, compensação bancária, impostos, seguros… o pacote completo.

Só que aí veio o mundo moderno.
E ele veio sem pedir licença.


📈 A explosão de dados (ou: quando o DB começou a suar frio)

Web, mobile, redes sociais, IoT, logs, sensores, streaming, analytics em tempo real…
De repente, o banco relacional passou a ouvir frases como:

  • “Preciso escalar horizontalmente.”

  • “Tem que responder em milissegundos.”

  • “O schema muda toda semana.”

  • “Esse JSON aqui é meio… flexível.”

Nesse momento nasce o que chamamos de Relational Problem:
👉 a dificuldade crescente de gerenciar, escalar e consultar dados usando RDBMS tradicionais em ambientes cada vez maiores, mais variados e mais exigentes.

O vilão clássico?

  • Schemas rígidos

  • Joins caros

  • Crescimento exponencial de volume

  • Performance sofrendo conforme a complexidade aumenta

📌 Easter egg: se você já viu um EXPLAIN com 12 joins e custo astronômico, você já sentiu o Relational Problem na pele.


🏗️ Solução 1: Escalar pra cima (o famoso “compra mais ferro”)

A primeira reação clássica é:

“Coloca mais CPU, mais memória e mais disco.”

No mundo mainframe isso tem nome, sobrenome e fatura alta 💸.

✔️ Funciona? Funciona.
❌ Resolve pra sempre? Não.

  • É caro

  • Tem limite físico

  • E uma hora… acaba

👉 Vertical scaling resolve dor imediata, não o problema estrutural.


🔧 Solução 2: Otimizar até a última gota

Aí entra o arsenal conhecido:

  • Índices

  • Partitioning

  • Denormalização

  • Tuning de SQL

  • Estatísticas afinadas na lua certa 🌕

Isso melhora muito, mas cobra seu preço:

  • Mais complexidade

  • Mais overhead operacional

  • Mais chances de alguém quebrar tudo num ALTER inocente

📌 Fofoquinha: todo ambiente tem aquele índice criado “em produção às pressas” que ninguém sabe se pode remover.


🌐 Solução 3: Relacional distribuído (o meio do caminho)

Aqui a ideia é ousada:

“Vamos manter o modelo relacional, mas espalhar os dados.”

Resultado:

  • Mais escalabilidade

  • Mais disponibilidade

  • E… mais complexidade de consistência e transação

💡 ACID distribuído não é trivial.
Quem já estudou two-phase commit sabe que não existe almoço grátis.


🚀 Solução 4: NoSQL — o rebelde sem gravata

Aí surgem os NoSQL:

  • Key-value

  • Documento

  • Colunar

  • Grafos

Eles dizem:

“Relaxa o schema, relaxa o relacionamento, escala horizontalmente e seja feliz.”

✔️ Alta performance
✔️ Flexibilidade
✔️ Escala global

❌ Menos garantias transacionais
❌ Consistência eventualmente… eventual 😅

📌 Easter egg: NoSQL não significa “No SQL”, mas muita gente usa como “No JOIN, graças a Deus”.


🔀 Solução 5: Abordagem híbrida (o mundo real)

Na prática, o que venceu foi o híbrido:

  • Relacional para transação crítica

  • NoSQL ou Data Warehouse para analytics e volume massivo

  • Cada banco no seu quadrado

👉 O banco certo para o problema certo.

💬 Comentário Bellacosa:
Mainframe + DB2 continua reinando onde consistência, auditoria e confiabilidade não são opcionais.


⚖️ Os grandes trade-offs (onde mora a dor)

Resolver o Relational Problem é basicamente escolher qual dor você aceita.

🔐 Consistência vs Disponibilidade & Escala

  • Relacional ama ACID

  • Distribuído ama performance

  • CAP theorem fica no meio rindo da sua cara

🧱 Rigidez de schema vs Flexibilidade

  • Schema fixo protege a integridade

  • Schema flexível acelera mudança

  • Um trava, o outro corre… e tropeça às vezes

⚙️ Performance vs Complexidade

  • Tuning melhora performance

  • Mas aumenta custo, risco e dependência de especialistas

💰 Custo vs Controle

  • Hardware e licenças caros

  • Cloud e distribuído mais baratos (até não serem)


🏦 Quem escolhe o quê?

  • Bancos, governos, seguradoras
    👉 Consistência, governança, auditoria
    👉 Relacional forte, bem cuidado, bem documentado

  • Empresas web-scale, data-driven
    👉 Escala, agilidade, crescimento rápido
    👉 Distribuído, NoSQL, híbrido

📌 Não é sobre tecnologia “melhor”.
É sobre prioridade de negócio.


☕ Conclusão estilo café no mainframe

O Relational Problem não significa que o modelo relacional falhou.
Significa que ele foi bom demais por tempo demais em um mundo que mudou radicalmente.

A maturidade está em entender:

  • Onde ele brilha

  • Onde ele sofre

  • E como combiná-lo com outras abordagens

💬 Última fofoquinha:
Quem decreta a “morte do relacional” geralmente nunca precisou fechar um balanço financeiro auditado.

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.


sábado, 9 de dezembro de 2023

SQL sem Mistérios no Db2 for z/OS

 

Bellacosa Mainframe e o sql sem misterios no db2 for z/os

☕ Um Café no Bellacosa Mainframe

SQL sem Mistérios no Db2 for z/OS

A Jornada Completa de uma Query no IBM Z — O Guia Definitivo do Programador COBOL Padawan Inspirado em Jornada nas Estrelas

"A lógica é o começo da sabedoria, não o fim."

— Sr. Spock


Introdução — Bem-vindo à USS Enterprise... digo... ao IBM Z

Imagine que você acabou de embarcar na USS Enterprise.

Você é um jovem cadete da Academia da Frota Estelar.

Seu trabalho não é pilotar a nave.

Também não é disparar phasers.

Sua missão é muito mais importante.

Você precisa descobrir como um simples pedido chega ao computador da nave, é analisado, processado e retorna em poucos milissegundos.

No universo Star Trek, esse computador responde perguntas como:

"Computador, localizar todos os oficiais Vulcanos da nave."

No mundo corporativo existe outro computador igualmente impressionante.

Ele atende pelo nome de IBM Z.

E seu cérebro de dados chama-se Db2 for z/OS.

Quando um programa COBOL executa um simples:

SELECT *
FROM CLIENTE
WHERE CPF='12345678900'

A maioria dos iniciantes imagina algo parecido com isto:

"O Db2 abriu a tabela, procurou o CPF e devolveu o registro."

Se fosse tão simples, este artigo terminaria aqui.

Mas...

Na realidade, entre o momento em que o programa envia o SQL e o momento em que os dados retornam, acontece uma verdadeira operação digna da Frota Estelar.

São dezenas de decisões inteligentes.

Milhares de estatísticas.

Análises matemáticas.

Escolha de estratégias.

Gerenciamento de memória.

Uso de caches.

Escolha de índices.

Controle de concorrência.

Tudo isso acontece quase instantaneamente.

Hoje vamos fazer uma viagem completa por essa jornada.

Prepare seu café.

Dr. Spock será nosso guia.


Capítulo 1 — O Computador Nunca Faz Apenas o Que Você Escreveu

Existe um dos maiores mitos entre iniciantes.

"Eu escrevi primeiro o SELECT."

Então ele executa primeiro.

Errado.

Na verdade, o Db2 praticamente ignora a ordem em que você escreveu.

Ele interpreta a intenção da consulta.

Depois decide sozinho como obter o resultado da forma mais eficiente possível.

É exatamente como Spock faria.

Se Kirk diz:

"Chegue até Vulcano."

Spock não pergunta:

"Qual estrada devo pegar?"

Ele calcula:

  • combustível

  • gravidade

  • buracos negros

  • campos de dobra

  • rotas inimigas

  • economia de energia

O destino é o mesmo.

O caminho muda.

O Db2 pensa exatamente assim.


Capítulo 2 — A Ponte de Comando do Db2

Imagine a ponte da Enterprise.

Cada oficial possui uma função.

No Db2 também.

OficialComponente Db2
Capitão KirkAplicação COBOL
Sr. SpockOptimizer
ScottyBuffer Manager
UhuraSQL Parser
SuluAccess Path
ChekovIndex Manager
ComputadorBuffer Pools
EngenhariaDisk Storage

O COBOL faz a pergunta.

Spock decide a melhor estratégia.

Scotty garante que tudo funcione.

O computador responde.


Capítulo 3 — A Missão Começa: EXEC SQL

Tudo começa aqui.

EXEC SQL

SELECT NOME

INTO :WS-NOME

FROM CLIENTES

WHERE CPF=:WS-CPF

END-EXEC.

Parece simples.

Mas isso ainda nem é SQL.

O COBOL sequer entende SQL.

Quem entende é o Pré-compilador.


Capítulo 4 — O Tradutor Universal

Antes da compilação acontece algo exclusivo do mundo Mainframe.

O famoso:

Pré-Compiler.

Ele encontra cada bloco EXEC SQL.

Substitui por chamadas internas.

Gera o famoso:

DBRM

(Database Request Module)

Este DBRM será utilizado posteriormente no BIND.

Curiosidade:

Oracle não trabalha assim.

SQL Server também não.

Este é um dos diferenciais históricos do Db2 z/OS.


Capítulo 5 — O Conselho Vulcano: BIND

Aqui mora uma das maiores diferenças entre o Db2 e praticamente todos os bancos relacionais.

O comando:

BIND PACKAGE

é como uma reunião do Alto Conselho Vulcano.

O Db2 olha para a consulta e pensa:

"Se esta SQL for executada milhões de vezes, qual será o melhor caminho?"

Ele cria um PACKAGE, contendo o plano de acesso ideal para aquele momento.

É aqui que nasce o famoso Access Path.


Capítulo 6 — O Dr. Spock Analisa as Probabilidades

Imagine duas tabelas.

CLIENTES

50 milhões de linhas.

ESTADOS

27 linhas.

Você faria o JOIN começando por qual?

Até um cadete responderia:

ESTADOS.

Mas...

Como o Db2 sabe disso?

A resposta chama-se:

RUNSTATS.


Capítulo 7 — RUNSTATS: Os Sensores de Longo Alcance

Os sensores da Enterprise informam:

  • quantas naves existem;

  • velocidade;

  • distância;

  • massa.

O RUNSTATS faz exatamente isso.

Ele informa ao Optimizer:

  • quantidade de linhas;

  • cardinalidade;

  • distribuição;

  • frequência;

  • seletividade;

  • clustering;

  • número de páginas;

  • estatísticas dos índices.

Sem RUNSTATS...

O Optimizer fica praticamente cego.

E um Spock sem sensores toma decisões muito piores.


Capítulo 8 — Álgebra Relacional: O Idioma Secreto do Computador

Depois que o SQL é validado, ele deixa de existir como texto.

Internamente transforma-se em Álgebra Relacional.

Por exemplo:

SELECT NOME
FROM CLIENTES
WHERE CIDADE='SP'

vira algo semelhante a:

σ Cidade='SP'

↓

π Nome

↓

CLIENTES

Ou seja:

primeiro seleciona.

Depois projeta.

O SQL desaparece.

Nasce um plano matemático.


Capítulo 9 — O Optimizer: O Verdadeiro Sr. Spock do IBM Z

Se existe um personagem que representa perfeitamente o Optimizer...

é o próprio Spock.

Ele nunca trabalha por emoção.

Somente lógica.

Ele calcula:

  • custo de CPU;

  • custo de I/O;

  • uso de Buffer Pools;

  • seletividade dos índices;

  • paralelismo;

  • volume esperado;

  • quantidade de páginas;

  • custo de SORT;

  • bloqueios.

Depois escolhe o menor custo possível.

Nem sempre será o caminho mais curto.

Será o mais eficiente.


Capítulo 10 — A Ordem Lógica da Consulta

Agora chegamos ao famoso diagrama.

Embora escrevamos:

SELECT

FROM

JOIN

ON

WHERE

GROUP BY

HAVING

ORDER BY

FETCH FIRST

O Db2 raciocina assim:

FROM

↓

JOIN

↓

ON

↓

WHERE

↓

GROUP BY

↓

HAVING

↓

SELECT

↓

ORDER BY

↓

FETCH FIRST

Mas cuidado.

Isto ainda não representa a ordem física.

Ela continua sendo decidida pelo Optimizer.


Capítulo 11 — O Access Path: A Rota Estelar

Aqui está o segredo.

O Db2 pode resolver exatamente a mesma SQL de dezenas de maneiras diferentes.

Ele escolhe entre:

  • Table Space Scan;

  • Index Scan;

  • Index Only Access;

  • List Prefetch;

  • Dynamic Prefetch;

  • Sequential Detection;

  • Nested Loop Join;

  • Merge Scan Join;

  • Hybrid Join;

  • Star Join;

  • Parallelism;

  • Materialized Query Table;

  • Sparse Index.

É como escolher diferentes rotas pelo Quadrante Alfa.

O destino é igual.

O caminho muda.


Capítulo 12 — O Buffer Pool: O Scotty da Memória

Scotty sempre dizia:

"Captain, I'm giving her all she's got!"

O Buffer Pool faz exatamente isso.

Antes de acessar o disco...

Ele pergunta:

"Essa página já está na memória?"

Se estiver...

Não existe I/O.

A resposta vem em microssegundos.

Grande parte do desempenho do Db2 depende da eficiência dos Buffer Pools.


Capítulo 13 — Os Predicados Stage 1 e Stage 2

Aqui existe uma armadilha clássica.

Observe:

WHERE YEAR(DATA)=2026

Parece bonito.

Mas destrói o uso do índice.

Muito melhor:

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

No primeiro caso:

Stage 2.

No segundo:

Stage 1.

O primeiro costuma obrigar o Db2 a avaliar linha por linha.

O segundo permite filtrar diretamente pelo índice.

Dica Bellacosa: sempre que possível, escreva predicados que possam ser avaliados durante o acesso aos dados. Essa é uma das otimizações mais valiosas para quem desenvolve em COBOL com Db2.


Capítulo 14 — EXPLAIN: A Caixa-Preta da Enterprise

Nenhum engenheiro sério tenta descobrir um problema apenas olhando para a nave.

Ele consulta os sensores.

No Db2 fazemos exatamente isso.

Utilizamos:

EXPLAIN

Ele revela:

  • qual índice foi escolhido;

  • ordem dos JOINs;

  • tipo de acesso;

  • custo estimado;

  • necessidade de SORT;

  • paralelismo;

  • número estimado de linhas.

Nunca adivinhe.

Sempre consulte o plano.


Capítulo 15 — Locks: O Controle de Segurança da Federação

Enquanto tudo acontece...

O Db2 protege os dados.

Existem diversos tipos de bloqueio:

  • IS (Intent Share)

  • IX (Intent Exclusive)

  • S (Share)

  • U (Update)

  • X (Exclusive)

  • SIX (Share with Intent Exclusive)

Além disso, os níveis de isolamento (UR, CS, RS e RR) determinam o equilíbrio entre concorrência e consistência. Em sistemas bancários e de cartões de crédito, essa gestão é essencial para evitar leituras incorretas, perdas de atualização e conflitos entre milhares de transações simultâneas.


Capítulo 16 — Paralelismo: Quando a Enterprise Usa Toda a Tripulação

Em grandes consultas analíticas, o Db2 pode dividir o trabalho.

Imagine:

CPU 1 lê uma partição.

CPU 2 lê outra.

CPU 3 realiza o JOIN.

CPU 4 faz a agregação.

No IBM Z isso acontece utilizando múltiplos processadores e, em muitos cenários, explorando zIIPs para determinadas cargas elegíveis, reduzindo o impacto sobre os CPs tradicionais.


Capítulo 17 — Quando Fazer REBIND?

Imagine que a Enterprise recebeu um novo motor de dobra.

Você continuaria usando os cálculos antigos?

Claro que não.

No Db2 acontece o mesmo.

Após mudanças significativas, como:

  • criação de índices;

  • remoção de índices;

  • crescimento expressivo das tabelas;

  • execução de RUNSTATS;

  • alterações na distribuição dos dados;

vale analisar um REBIND PACKAGE ou REBIND PLAN, permitindo que o Optimizer recalcule um novo Access Path mais eficiente.


Capítulo 18 — O Programador COBOL Jedi... ou Vulcano?

Existe um momento em que o programador deixa de escrever SQL "que funciona".

E começa a escrever SQL "que escala".

Ele passa a pensar:

  • Meu predicado usa índice?

  • Meu JOIN é seletivo?

  • O EXPLAIN confirma minha hipótese?

  • As estatísticas estão atualizadas?

  • O SORT pode ser eliminado?

  • Estou lendo mais linhas do que preciso?

  • O FETCH FIRST pode reduzir trabalho?

  • Existe uma forma mais eficiente de escrever esta consulta?

Esse é o verdadeiro salto de maturidade.


Easter Egg Bellacosa ☕

No episódio "The Ultimate Computer", a Enterprise recebe o computador M-5, projetado para tomar decisões automaticamente.

No começo, tudo parece perfeito.

Depois surgem consequências inesperadas.

O Db2 Optimizer lembra um pouco essa história.

Ele toma decisões sozinho, mas depende da qualidade das informações que recebe.

Se as estatísticas estiverem desatualizadas, um índice importante não existir ou o modelo físico estiver inadequado, até um excelente otimizador poderá escolher um plano ruim.

A diferença é que, felizmente, o Optimizer não tenta assumir o comando da Enterprise nem entra em combate por conta própria.


Curiosidades

  • O Db2 for z/OS está entre os bancos de dados com os otimizadores mais sofisticados do mercado, evoluindo continuamente desde a década de 1980.

  • Um único SELECT pode gerar dezenas de operações internas invisíveis ao desenvolvedor.

  • Em ambientes de missão crítica, o mesmo SQL pode ser executado milhões de vezes por dia, tornando pequenas otimizações responsáveis por economias enormes de CPU e tempo.

  • Muitos problemas de desempenho atribuídos ao COBOL, na verdade, são consequência de SQL mal escrito ou de um plano de acesso inadequado.


Conclusão — A Lógica é a Maior Aliada do Programador

Ao final desta jornada, descobrimos que uma instrução SQL percorre um caminho muito maior do que imaginávamos. Ela nasce no programa COBOL, passa pelo pré-compilador, gera um DBRM, é ligada a PACKAGEs e PLANs durante o BIND, tem seu plano analisado pelo Optimizer, consulta estatísticas produzidas pelo RUNSTATS, escolhe um Access Path, utiliza Buffer Pools, controla bloqueios, decide estratégias de JOIN e somente então retorna os dados solicitados.

Para um programador COBOL Padawan, compreender essa sequência é um divisor de águas. Você deixa de enxergar o Db2 como uma simples "caixa-preta" e passa a entendê-lo como um verdadeiro computador da Frota Estelar: um sistema que utiliza lógica, estatística e otimização para tomar a melhor decisão possível a cada consulta.

Como diria o Sr. Spock, "A lógica é o começo da sabedoria, não o fim." No universo do IBM Z, essa lógica está presente em cada SELECT, em cada índice e em cada plano de acesso. Quanto melhor você compreender esse funcionamento, mais preparado estará para construir aplicações COBOL rápidas, escaláveis e confiáveis — dignas de uma missão de cinco anos explorando as fronteiras da computação corporativa.

sábado, 1 de julho de 2023

☕ SQL NO MAINFRAME: MUITO ALÉM DO SELECT

 

Bellacosa Mainframe e o SQL no Mainframe muito alem do select



☕ SQL NO MAINFRAME: MUITO ALÉM DO SELECT

Como Dominar os Fundamentos de SQL no DB2 13 for z/OS

Quando alguém abre o SPUFI, Data Studio, DBeaver ou qualquer ferramenta SQL pela primeira vez, normalmente executa algo simples:

SELECT *
FROM CLIENTES;

A consulta retorna dados.

O usuário sorri.

Acredita que aprendeu SQL.

Mas na realidade acabou de dar apenas o primeiro passo de uma longa jornada.

No universo Mainframe, SQL é a língua falada entre:

  • COBOL

  • CICS

  • IMS

  • Java

  • Web Services

  • APIs REST

  • z/OS Connect

  • Analytics

  • Inteligência Artificial

Todo sistema corporativo moderno passa por SQL em algum momento.

E o DB2 13 elevou ainda mais essa importância.


A HISTÓRIA QUE TODO PROFISSIONAL DE MAINFRAME DEVERIA CONHECER

Antes do SQL, bancos relacionais eram apenas uma teoria.

Em 1970, Edgar F. Codd publicou um artigo revolucionário na IBM:

A Relational Model of Data for Large Shared Data Banks

Esse trabalho mudou a computação.

A ideia era simples:

Ao invés de navegar registros fisicamente, os usuários deveriam dizer:

"Quero estes dados."

E o banco decidiria:

"Eu descubro a melhor forma de encontrá-los."

Nascia o conceito de SQL.

Décadas depois, essa filosofia continua viva dentro do DB2 13.


O QUE É SQL?

SQL significa:

Structured Query Language

Ou:

Linguagem Estruturada de Consulta

Ela permite:

  • Consultar dados

  • Inserir dados

  • Alterar dados

  • Excluir dados

  • Criar estruturas

  • Gerenciar segurança

Praticamente tudo que fazemos no DB2 passa por SQL.


OS QUATRO GRANDES GRUPOS DE COMANDOS SQL

DQL – Data Query Language

Consulta de dados.

Exemplo:

SELECT *
FROM FUNCIONARIOS;

DML – Data Manipulation Language

Manipulação de registros.

INSERT INTO FUNCIONARIOS
VALUES
(100,'CARLOS');
UPDATE FUNCIONARIOS
SET SALARIO = 5000
WHERE MATRICULA = 100;
DELETE
FROM FUNCIONARIOS
WHERE MATRICULA = 100;

DDL – Data Definition Language

Definição das estruturas.

CREATE TABLE CLIENTES
(
 ID INTEGER,
 NOME VARCHAR(50)
);

DCL – Data Control Language

Controle de segurança.

GRANT SELECT
ON CLIENTES
TO USER01;

A TABELA É O CORAÇÃO DO DB2

Imagine um arquivo VSAM KSDS.

Agora imagine esse conceito evoluído.

Uma tabela é composta por:

  • Linhas

  • Colunas

  • Relacionamentos

  • Índices

  • Constraints

Exemplo:

IDNOMECIDADE
1ANASÃO PAULO
2JOÃOSANTOS
3MARIARIO

Essa simplicidade aparente esconde uma enorme complexidade de armazenamento.


SUA PRIMEIRA CONSULTA DE VERDADE

O erro mais comum é usar:

SELECT *
FROM CLIENTES;

Em produção isso costuma ser um desastre.

O profissional experiente utiliza:

SELECT
    ID,
    NOME,
    CIDADE
FROM CLIENTES;

Por quê?

Porque reduz:

  • I/O

  • CPU

  • Network Traffic

  • Uso de buffer pools

No DB2 13 isso continua sendo uma das melhores práticas.


APRENDENDO A FILTRAR DADOS

O poder real surge com o WHERE.

SELECT
    NOME
FROM CLIENTES
WHERE CIDADE = 'SANTOS';

Sem WHERE:

SCAN TOTAL

Com WHERE:

BUSCA DIRECIONADA

Diferença gigantesca.

Principalmente em tabelas com bilhões de linhas.


OPERADORES MAIS UTILIZADOS

Igualdade

WHERE ID = 100

Diferente

WHERE ID <> 100

Maior

WHERE SALARIO > 10000

Menor

WHERE SALARIO < 5000

Intervalo

WHERE SALARIO
BETWEEN 5000 AND 10000

Lista

WHERE CIDADE
IN ('SANTOS','CAMPINAS')

LIKE: A ARMA SECRETA DOS ANALISTAS

SELECT *
FROM CLIENTES
WHERE NOME LIKE 'MAR%';

Retorna:

  • MARIA

  • MARCOS

  • MARCELO

Mas atenção.

LIKE mal utilizado pode destruir a performance.

Exemplo ruim:

LIKE '%MAR%'

O otimizador normalmente perde a possibilidade de usar índices eficientemente.


ORDER BY

Organizando resultados.

SELECT
NOME,
SALARIO
FROM FUNCIONARIOS
ORDER BY SALARIO DESC;

Maior salário primeiro.

Muito simples.

Muito poderoso.

Muito custoso quando mal utilizado.


DISTINCT

Eliminando duplicidades.

SELECT DISTINCT
CIDADE
FROM CLIENTES;

Resultado:

SANTOS
CAMPINAS
RIO

Sem repetições.


CONTANDO REGISTROS

Todo DBA utiliza:

SELECT COUNT(*)
FROM CLIENTES;

Mas poucos iniciantes sabem que em tabelas gigantes isso pode gerar leituras enormes.

Por isso estatísticas e catálogos do DB2 também são utilizados para estimativas.


FUNÇÕES DE AGREGAÇÃO

Soma

SELECT SUM(VALOR)
FROM VENDAS;

Média

SELECT AVG(SALARIO)
FROM FUNCIONARIOS;

Máximo

SELECT MAX(SALARIO)
FROM FUNCIONARIOS;

Mínimo

SELECT MIN(SALARIO)
FROM FUNCIONARIOS;

GROUP BY: ONDE O SQL COMEÇA A FICAR INTERESSANTE

Exemplo:

SELECT
CIDADE,
COUNT(*)
FROM CLIENTES
GROUP BY CIDADE;

Resultado:

CidadeQuantidade
Santos1200
São Paulo5800
Campinas900

Aqui começamos a transformar dados em informação.


HAVING

Filtrando grupos.

SELECT
CIDADE,
COUNT(*)
FROM CLIENTES
GROUP BY CIDADE
HAVING COUNT(*) > 1000;

Somente cidades relevantes aparecem.


JOINS: O SUPERPODER DO SQL

Aqui nasce o verdadeiro banco relacional.

Tabela CLIENTES:

IDNOME
1ANA

Tabela PEDIDOS:

PEDIDOID_CLIENTE
1001

Consulta:

SELECT
C.NOME,
P.PEDIDO
FROM CLIENTES C
INNER JOIN PEDIDOS P
ON C.ID = P.ID_CLIENTE;

Resultado:

ANA 100

Magia?

Não.

Modelo relacional.


INNER JOIN

Retorna apenas correspondências.

INNER JOIN

É o JOIN mais utilizado do mundo.


LEFT JOIN

Mantém todos os registros da esquerda.

LEFT JOIN

Mesmo sem correspondência.

Muito usado em auditorias.


SUBSELECTS

Uma consulta dentro da outra.

SELECT *
FROM FUNCIONARIOS
WHERE SALARIO >
(
SELECT AVG(SALARIO)
FROM FUNCIONARIOS
);

Funcionários acima da média.

Excelente exemplo de lógica relacional.


SQL E COBOL: UMA DUPLA IMBATÍVEL

Em Mainframe o SQL raramente vive sozinho.

Exemplo Embedded SQL:

EXEC SQL
SELECT NOME
INTO :WS-NOME
FROM CLIENTES
WHERE ID = :WS-ID
END-EXEC.

Esse padrão movimenta bancos, seguradoras, governos e bolsas de valores há décadas.


O PAPEL DO BIND

Iniciantes aprendem SQL.

Profissionais Mainframe aprendem:

  • Pré-compilação

  • DBRM

  • PACKAGE

  • PLAN

  • BIND

Sem isso o SQL não chega à produção.


O OTIMIZADOR: O CÉREBRO DO DB2

O usuário escreve:

SELECT *
FROM CLIENTES
WHERE ID = 100;

O DB2 pergunta:

  • Uso índice?

  • Faço scan?

  • Quantas páginas?

  • Quanto CPU?

Esse processo é chamado:

Access Path Selection

É aqui que a mágica acontece.


EXPLAIN: O RAIO-X DA CONSULTA

Nunca confie apenas porque uma consulta funciona.

Verifique o plano.

EXPLAIN PLAN FOR
SELECT *
FROM CLIENTES;

O DB2 mostrará:

  • Índices usados

  • Custo estimado

  • Estratégias de acesso

DBAs vivem nessa análise.


O QUE MUDA NO DB2 13?

O DB2 13 trouxe avanços importantes:

Melhor exploração de estatísticas

O otimizador toma decisões mais inteligentes.

Melhor uso de CPU

Redução de consumo em workloads intensos.

Aprimoramentos em SQL Analytics

Funções analíticas mais eficientes.

Melhor integração híbrida

Conectividade moderna com APIs e aplicações distribuídas.

Evolução contínua do Machine Learning para otimização

Capacidade crescente de melhorar decisões de acesso com base em padrões observados.


ERROS CLÁSSICOS DOS INICIANTES

SELECT *

Evite.


Falta de índice

Performance despenca.


WHERE inadequado

Full table scan.


JOIN sem critério

Explosão de registros.


UPDATE sem WHERE

O terror dos DBAs.

UPDATE CLIENTES
SET STATUS='A';

Toda tabela alterada.

Acidente clássico.


O CAMINHO PARA VIRAR ESPECIALISTA

Etapa 1

Dominar SELECT.


Etapa 2

Dominar filtros.


Etapa 3

Dominar JOINs.


Etapa 4

Entender índices.


Etapa 5

Aprender EXPLAIN.


Etapa 6

Estudar catálogo DB2.


Etapa 7

Entender RUNSTATS.


Etapa 8

Compreender Access Paths.


Etapa 9

SQL embarcado em COBOL.


Etapa 10

Otimização avançada.


CONCLUSÃO: SQL É A NOVA LINGUAGEM UNIVERSAL DO MAINFRAME

Muitos profissionais acreditam que dominar COBOL é suficiente para trabalhar em Mainframe.

Não é.

O mercado moderno exige uma combinação poderosa:

  • COBOL

  • JCL

  • CICS

  • RACF

  • DB2

  • SQL

E dentro desse conjunto, SQL ocupa uma posição privilegiada.

Toda aplicação corporativa depende dele.

Toda API consulta dados através dele.

Toda IA corporativa precisa dele.

Todo analista precisa entendê-lo.

O segredo não é decorar comandos.

O segredo é compreender o que acontece por trás deles.

Quando você entende como o DB2 13 interpreta uma consulta, escolhe índices, calcula custos, acessa páginas e otimiza recursos, deixa de ser apenas alguém que escreve SQL.

Você passa a pensar como o próprio banco de dados.

E, no universo Bellacosa Mainframe, é exatamente aí que começa a verdadeira jornada: não em aprender comandos, mas em aprender a conversar com um dos sistemas mais sofisticados já construídos pela engenharia da computação.

☕🚀 Bem-vindo ao mundo do DB2 13. O primeiro SELECT é simples. O desafio real é transformar consultas em performance, conhecimento e valor para o negócio.


domingo, 28 de novembro de 2021

SQL sem Mistérios — O Caminho do Programador COBOL Padawan para Pensar Como um Analista Sênior

  

Bellacosa Mainframe e o sql sem misterios

☕ Um Café no Bellacosa Mainframe

SQL sem Mistérios — O Caminho do Programador COBOL Padawan para Pensar Como um Analista Sênior

Da Tela Verde do IBM Z à Ponte da USS Enterprise: por que escrever SQL é apenas o começo da missão

"A lógica é o princípio da sabedoria, não o seu fim."
— Adaptado de Spock


Introdução — O dia em que descobri que SQL não era o verdadeiro problema

Existe um momento na carreira de praticamente todo programador COBOL em que acontece algo curioso.

Você termina seu primeiro programa COBOL com Embedded SQL.

Compila.

Faz o BIND.

Executa o JCL.

O programa termina RC=0000.

Os dados aparecem na tela.

Você sorri.

"Parece que deu certo."

Dias depois...

O usuário telefona.

— "Os números estão errados."

Você verifica novamente.

O programa funciona.

O SQL executa.

Nenhum SQLCODE negativo.

Nenhum ABEND.

Mesmo assim...

Os números continuam errados.

Foi exatamente nesse momento que milhares de desenvolvedores descobriram uma verdade que nenhum livro de SQL ensina:

Escrever SQL é fácil. Produzir informação confiável é a verdadeira profissão.

É justamente essa diferença que separa um analista iniciante de um analista experiente.

No universo do IBM Z, essa diferença pode representar:

  • milhões de registros processados corretamente;

  • horas de CPU economizadas;

  • auditorias aprovadas;

  • noites tranquilas para o operador do JES2.

Hoje embarcaremos na USS Enterprise para entender por que dois profissionais podem escrever praticamente o mesmo SQL e, ainda assim, entregar resultados completamente diferentes.

Prepare seu tricorder.

O Capitão autorizou nossa missão.


Capítulo 1 — A USS Enterprise e o IBM Z

Imagine a Enterprise.

Todos conhecem o computador da nave.

Mas quem realmente toma decisões?

Não é o computador.

É a tripulação.

O computador apenas executa ordens.

O Db2 faz exatamente isso.

Ele não sabe o significado de:

  • cliente

  • pagamento

  • imposto

  • comissão

  • salário

Ele apenas processa relacionamentos matemáticos.

Quem entende o negócio é você.

E aí aparece a primeira lição do Dr. Spock.

"O computador não produz inteligência.
Apenas executa lógica."


Capítulo 2 — O maior erro do Padawan

O iniciante abre o SPUFI ou o Data Studio.

Digita:

SELECT *
FROM CLIENTES;

Executa.

Olha.

Executa novamente.

Adiciona uma coluna.

Executa outra vez.

Coloca um JOIN.

Executa novamente.

Esse comportamento possui um nome.

Programação por tentativa e erro.

Funciona?

Às vezes.

Escala?

Nunca.


Como o veterano trabalha

Antes de abrir qualquer editor, ele responde perguntas.

O que o usuário deseja?

Qual decisão será tomada com esse relatório?

Quem utilizará esses dados?

Qual é a definição oficial desse indicador?

Qual a granularidade?

Cliente?

Pedido?

Produto?

Contrato?

Conta bancária?

Só depois disso ele escreve SQL.

O código nasce praticamente pronto.


Capítulo 3 — A Granularidade: o segredo escondido

Poucos iniciantes aprendem isso.

Na verdade, talvez seja um dos conceitos mais importantes do Data Warehouse moderno.

Imagine estas tabelas:

CLIENTES

Cliente
Nome
Cidade

PEDIDOS

Pedido
Cliente
Valor

ITENS

Pedido
Produto
Quantidade

Pergunta simples:

Qual o faturamento por cliente?

Muitos fazem:

CLIENTES

PEDIDOS

ITENS

SUM()

Resultado?

Dobrou.

Triplicou.

Explodiu.

Por quê?

Porque cada pedido aparece várias vezes.

Cada item multiplica o valor.

Esse fenômeno recebe um nome:

Cardinality Explosion

No Db2 ele custa CPU.

Na empresa custa credibilidade.


Curiosidade Bellacosa ☕

A maioria dos erros financeiros em SQL não acontece porque alguém escreveu uma função errada.

Acontece porque alguém esqueceu a granularidade.


Capítulo 4 — O mito do DISTINCT

Todo mundo já viu isso.

SELECT DISTINCT

Magicamente...

Os números diminuem.

Parece resolvido.

Na verdade...

Você acabou de esconder um problema.

DISTINCT remove linhas iguais.

Mas não explica por que elas ficaram iguais.

É como desligar o alarme de incêndio sem apagar o fogo.


Como Spock resolveria

Primeiro ele perguntaria:

Existe chave primária?

Existe chave composta?

Existe relacionamento 1:N?

Existe histórico?

Existe duplicidade legítima?

Depois faria o JOIN.


Capítulo 5 — O verdadeiro significado do JOIN

JOIN não significa unir tabelas.

JOIN significa combinar entidades diferentes preservando significado.

Um JOIN correto exige conhecer:

  • regras de negócio;

  • integridade referencial;

  • cardinalidade;

  • qualidade dos dados.

No mainframe isso é ainda mais importante porque muitas aplicações nasceram décadas antes da existência das chaves estrangeiras automáticas.

Você precisa conhecê-las.


Capítulo 6 — SELECT * custa dinheiro

O iniciante pensa:

"Mais fácil pegar tudo."

O Db2 pensa diferente.

Cada coluna significa:

  • mais páginas;

  • mais buffer pool;

  • mais cache;

  • mais leitura;

  • mais CPU.

Imagine uma tabela com 300 colunas.

Seu relatório usa apenas cinco.

SELECT *

lê as 300.

Num IBM Z isso significa MIPS.

MIPS significam dinheiro.


Regra de ouro

Selecione somente o que será utilizado.

Nem uma coluna a mais.


Capítulo 7 — A arte de confiar nos dados

O iniciante olha dez linhas.

"Parece certo."

Entrega.

O analista experiente nunca acredita na primeira execução.

Ele faz auditorias.


Checklist clássico

COUNT(*)

COUNT(coluna)

COUNT(DISTINCT)

MIN()

MAX()

AVG()

NULL

Duplicados

Valores negativos

Faixas inválidas

Datas futuras

Datas impossíveis

Esse ritual pode parecer exagerado.

Até o dia em que salva sua carreira.


Easter Egg Star Trek

Na Enterprise existe redundância em praticamente tudo.

Motores.

Computadores.

Sensores.

Por quê?

Porque confiar em um único indicador é perigoso.

O mesmo vale para SQL.

Nunca valide apenas uma métrica.


Capítulo 8 — NULL: o inimigo invisível

NULL é talvez o conceito mais incompreendido do SQL.

NULL não significa:

zero

vazio

espaço

falso

NULL significa:

valor desconhecido.

Veja:

WHERE SALARIO > 5000

Quem possui NULL?

Some.

Sem aviso.

Sem erro.

Sem SQLCODE.


Quantos relatórios já ficaram errados por causa disso?

Milhares.


Capítulo 9 — Performance não começa depois

Muitos pensam:

Primeiro faço funcionar.

Depois otimizo.

O veterano pensa diferente.

Ele escreve pensando no otimizador.


O EXPLAIN é seu tricorder

No Star Trek, ninguém entra em um planeta desconhecido sem usar o tricorder.

No Db2, ninguém deveria executar uma consulta crítica sem analisar o EXPLAIN.

Ele mostra:

  • índice usado;

  • tipo de JOIN;

  • SORT;

  • acesso sequencial;

  • custo estimado;

  • filtro aplicado.

É literalmente o mapa da missão.


Capítulo 10 — O índice é um elevador

Imagine um prédio.

Você precisa ir ao andar 90.

Sem elevador.

Escadas.

Isso é um Table Space Scan.

Agora imagine um elevador.

Isso é um índice.

Agora imagine alguém fechando a porta do elevador.

Quem faz isso?

Funções sobre colunas indexadas.

Exemplo:

WHERE YEAR(DATA)=2026

Melhor:

WHERE DATA BETWEEN ...

Agora o elevador funciona novamente.


Capítulo 11 — Window Functions

Antigamente fazíamos:

JOIN

JOIN

JOIN

Subconsulta

Mais JOIN

Hoje basta:

ROW_NUMBER()

RANK()

LAG()

LEAD()

SUM() OVER()

Essas funções diminuem:

CPU

complexidade

manutenção

e deixam o código muito mais elegante.


Capítulo 12 — CTEs: capítulos de uma história

O iniciante escreve um SQL de 700 linhas.

Sem espaços.

Sem comentários.

Boa sorte.

O veterano usa CTEs.

ClientesAtivos

↓

PedidosRecentes

↓

PedidosValidados

↓

ResumoFinanceiro

↓

Resultado

Cada bloco conta uma parte da história.

O SQL vira documentação.


Capítulo 13 — Comentários inteligentes

Comentário ruim:

-- soma valores

Comentário útil:

-- Clientes ativos são aqueles
-- que efetuaram pelo menos
-- uma compra nos últimos
-- 180 dias conforme definição
-- da área financeira.

Explique o motivo.

Nunca o óbvio.


Capítulo 14 — O poder da reutilização

Uma consulta salva na área de trabalho morre junto com o computador.

Uma View.

Uma Stored Procedure.

Uma biblioteca Git.

Sobrevivem anos.

O conhecimento coletivo vale muito mais que scripts isolados.


Capítulo 15 — O que o COBOL ensina sobre SQL

Curiosamente, programadores COBOL costumam desenvolver uma vantagem natural.

Eles aprendem cedo conceitos como:

  • precisão;

  • processamento determinístico;

  • validação;

  • tratamento de erros;

  • responsabilidade sobre os dados.

Esses princípios se encaixam perfeitamente em SQL.

O verdadeiro desafio é abandonar a mentalidade de "fazer funcionar" e adotar a mentalidade de "garantir que está correto".


Capítulo 16 — O Fluxo Mental de um Analista Sênior

Antes de escrever qualquer linha de SQL, um profissional experiente costuma seguir um roteiro semelhante:

  1. Compreender a pergunta de negócio.

  2. Identificar a fonte oficial dos dados.

  3. Definir a granularidade do resultado.

  4. Verificar chaves primárias, candidatas e relacionamentos.

  5. Planejar filtros para reduzir o volume de dados o mais cedo possível.

  6. Escolher apenas as colunas necessárias.

  7. Esboçar CTEs que representem cada etapa da lógica.

  8. Executar consultas de auditoria (COUNT, COUNT(DISTINCT), MIN, MAX, análise de NULL).

  9. Avaliar o plano de execução com EXPLAIN.

  10. Comparar o resultado com uma fonte confiável.

  11. Documentar as regras de negócio.

  12. Versionar a solução para que toda a equipe possa reutilizá-la.

Perceba que escrever o SELECT é apenas uma pequena parte desse processo.


Curiosidades

O primeiro SQL raramente é o melhor

Analistas experientes reescrevem consultas várias vezes antes de entregá-las. Não porque o SQL esteja errado, mas porque sempre existe uma forma mais clara, mais eficiente ou mais fácil de manter.


O melhor SQL é o que outro profissional entende

Uma consulta extremamente inteligente, mas impossível de ler, costuma gerar mais problemas do que benefícios. Clareza é uma característica de engenharia.


O DBA e o desenvolvedor não são adversários

Em muitas equipes, existe a falsa ideia de que o DBA apenas "reclama" das consultas lentas. Na prática, o DBA enxerga o comportamento do banco como um todo e pode identificar oportunidades que passam despercebidas durante o desenvolvimento.


Bellacosa Mainframe — Dicas do Capitão

✅ Entenda o problema antes de abrir o editor.

✅ Nunca use SELECT * em produção sem um motivo claro.

✅ Conheça a granularidade dos dados antes de fazer JOIN.

✅ Desconfie de qualquer DISTINCT que "resolve" um problema.

✅ Sempre audite NULL, duplicidades e totais.

✅ Aprenda a interpretar EXPLAIN com a mesma dedicação que aprende SQL.

✅ Escreva consultas para que outra pessoa consiga mantê-las daqui a cinco anos.

✅ Pense em reutilização: CTEs bem nomeadas, views, procedimentos e controle de versão transformam consultas em patrimônio da equipe.


Conclusão — O que Spock ensinaria sobre SQL

No final desta jornada, percebemos que a diferença entre um analista iniciante e um analista sênior não está na quantidade de comandos SQL decorados. Ambos conhecem SELECT, JOIN, GROUP BY e ORDER BY. O que realmente muda é a forma de pensar.

Spock jamais executaria uma consulta apenas porque ela compila. Ele questionaria a lógica, verificaria as premissas, confrontaria os resultados com outras evidências e só então confiaria na resposta. Essa postura científica é a essência da engenharia de dados.

No universo do IBM Z, onde milhões de transações financeiras, seguros, companhias aéreas e sistemas governamentais dependem da integridade dos dados, um SQL "que funciona" não é suficiente. Ele precisa ser correto, performático, auditável, reutilizável e compreensível.

O verdadeiro crescimento profissional acontece quando o desenvolvedor deixa de perguntar "Como faço esta consulta funcionar?" e passa a perguntar "Como posso garantir que esta informação continuará correta daqui a dez anos?"

Esse é o momento em que um Padawan do COBOL deixa de apenas escrever SQL e começa a pensar como um verdadeiro engenheiro de software — alguém que transforma dados em confiança, lógica em conhecimento e consultas em decisões que movem organizações inteiras.

Como diria o Sr. Spock ao encerrar a missão:

"A consulta mais rápida não é necessariamente a melhor. A melhor é aquela cuja lógica permanece verdadeira, mesmo quando todos os dados do universo são colocados à prova."

 

domingo, 4 de outubro de 2009

🔷 INNER JOIN no IBM DB2 Mainframe – A Arte de Relacionar Tabelas

 

Bellacosa Mainframe apresenta IBM Mainframe DB2 Inner Join

🔷 INNER JOIN no IBM DB2 Mainframe – A Arte de Relacionar Tabelas

Se você trabalha com IBM Mainframe, provavelmente já precisou combinar dados de diferentes tabelas. E para isso existe o INNER JOIN, que é o clássico entre os joins em SQL.

Mas antes de entrar nos detalhes, vamos à história…


🕰️ História e Origem

O conceito de INNER JOIN vem diretamente do Modelo Relacional de Codd (1970), criado dentro da IBM.

  • Edgar F. Codd, um cientista da IBM, imaginou que dados deveriam ser armazenados em tabelas relacionais e manipulados por álgebra relacional.

  • Ele não inventou “INNER JOIN” como conhecemos hoje, mas a ideia de combinar tabelas via chaves comuns nasceu com ele.

  • SQL evoluiu nos anos 80 para suportar explicitamente joins:

    • Sintaxe implícita: FROM A, B WHERE A.key = B.key

    • Sintaxe explícita: FROM A INNER JOIN B ON A.key = B.key

No DB2 para Mainframe, o INNER JOIN é altamente otimizado para lidar com milhões de linhas em transações batch ou OLTP, mantendo a performance crítica.


⚙️ O que é INNER JOIN?

INNER JOIN é a operação que retorna somente as linhas onde existe correspondência em ambas as tabelas, baseado em uma chave comum.

🔹 Sintaxe padrão DB2

-- Explicit INNER JOIN (recomendado) SELECT E.EmployeeID, E.LastName, O.OrderID FROM Employees E INNER JOIN Orders O ON E.EmployeeID = O.EmployeeID;
-- Implicit INNER JOIN (estilo antigo) SELECT E.EmployeeID, E.LastName, O.OrderID FROM Employees E, Orders O WHERE E.EmployeeID = O.EmployeeID;

🔹 Observações

  • Chave comum: não precisa ter o mesmo nome, apenas valores compatíveis.

  • Sem correspondência → linha é descartada.

  • Pode usar múltiplas tabelas → INNER JOIN é associativo.


💡 Dicas Bellacosa para Mainframe

  1. Prefira joins explícitos (INNER JOIN ON) em DB2 → facilita leitura e manutenção.

  2. Sempre qualifique colunas se houver nomes repetidos → evita ambiguidade (E.EmployeeID, O.EmployeeID).

  3. Use aliases curtos → economiza digitação e deixa o código limpo.

  4. Evite cartesian products sem intenção → FROM A, B sem WHERE é um Product, que explode linhas.

  5. Verifique estatísticas de tabela → DB2 otimiza join usando índices.


🔍 Curiosidades & Easter Eggs

  • No DB2, todas as joins são INNER por padrão se você não usar OUTER.

  • Internamente, o otimizador transforma INNER JOIN em operações de álgebra relacional: Product + Selection.

  • Usar JOIN explícito ajuda o Explain Plan a gerar caminhos de acesso mais eficientes.

  • Combinar índices corretos + INNER JOIN = batch mais rápido, menos I/O.


🧪 Exemplo prático

Imagine que temos duas tabelas no z/OS DB2:

EMPLOYEES

EmployeeIDLastNameDeptID
101Smith10
102Jones20

DEPARTMENTS

DeptIDDeptName
10Accounting
20HR
30IT

Query: INNER JOIN

SELECT E.LastName, D.DeptName FROM Employees E INNER JOIN Departments D ON E.DeptID = D.DeptID;

Resultado:

LastNameDeptName
SmithAccounting
JonesHR

Observe: DeptID = 30 não aparece porque não há funcionário correspondente.


📈 Uso e Razão de Uso

  • Combinar tabelas relacionadas → RELACIONAL puro

  • Resumir informações em relatórios ou dashboards OLAP

  • Criar answer sets consistentes para análises

  • Fundamental para consultas em ERP, finanças e logística

No mainframe, INNER JOIN é usado em:

  • Batch → processa milhões de registros rapidamente

  • Online Transaction Processing (OLTP) → respostas rápidas e consistentes


⚡ Impacto na Performance e Otimização

  1. Indexes importam muito:

    • JOIN em colunas indexadas = leitura rápida, menos I/O

    • Sem índice → DB2 faz table scan → lento em tabelas grandes

  2. Estatísticas DB2:

    • RUNSTATS ajuda o otimizador a escolher o caminho ideal

  3. Número de tabelas no JOIN:

    • Mais joins = mais complexidade e consumo de CPU

    • Prefira joins em cascata controlados, evite joins desnecessários

  4. Filtros antes do JOIN:

    • Use WHERE/qualificação para reduzir linhas antes do INNER JOIN

    • Isso diminui o volume de dados processados e acelera o batch


🔑 Comentários finais Bellacosa

  • INNER JOIN é a base do SQL relacional, especialmente no DB2 do mainframe.

  • Sintaxe explícita + colunas qualificadas + índices corretos = performance top de linha.

  • Mesmo em 2026, ele é indispensável em sistemas críticos da IBM.

  • Dica bônus: use EXPLAIN PLAN para ver como DB2 executa seus INNER JOINs.

💡 Easter Egg:

Por baixo do capô, o DB2 transforma cada INNER JOIN em Product + Selection + Projection na álgebra relacional — a magia acontece silenciosa enquanto você apenas digita INNER JOIN.

 

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