📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 08: Bancos de Dados SQL e NoSQL. Recomendado revisar antes de começar.

🛡️ DBA Enterprise: Otimização de Performance, Particionamento & RLS

v4.0 — Nível Sênior / DBA de Missão Crítica

Trilha de Engenharia de Dados & Bancos de Dados — Projeto 4 de 4

🎓 Nível Profissional Simulado: DBA Sênior / Principal Data Architect. Em tabelas com dezenas de milhões de registros, um simples SELECT sem partição ou sem índice adequado derruba a infraestrutura inteira. Aqui você aprende as técnicas de grandes bancos e fintechs: Particionamento de Tabelas, Índices BRIN/GIN, Row-Level Security (RLS) e Tuning fino com EXPLAIN BUFFERS.


🎯 Objetivo

Construir uma arquitetura de banco de dados corporativa de altíssima escala utilizando Particionamento Declarativo por Faixa de Data (Range Partitioning), Índices de Bloco BRIN para séries temporais, Índices GIN para dados JSONB e isolamento de segurança com Row-Level Security (RLS).


🏗️ Arquitetura de Particionamento & Row-Level Security

flowchart TD
    classDef main fill:#1E293B,stroke:#0EA5E9,stroke-width:2px,color:#fff;
    classDef part fill:#0F172A,stroke:#38BDF8,stroke-width:1px,color:#fff;
    classDef sec fill:#881337,stroke:#F43F5E,stroke-width:1px,color:#fff;

    M["🏛️ Tabela Mestre: logs_auditoria<br/>(PARTITION BY RANGE: criado_em)"]:::main

    M --> P1["📁 Partição Jan/2026<br/>logs_auditoria_2026_01<br/>['2026-01-01' .. '2026-02-01')"]:::part
    M --> P2["📁 Partição Fev/2026<br/>logs_auditoria_2026_02<br/>['2026-02-01' .. '2026-03-01')"]:::part
    M --> P3["📁 Partição Mar/2026<br/>logs_auditoria_2026_03<br/>['2026-03-01' .. '2026-04-01')"]:::part

    P1 -.-> B1["⚡ Índice BRIN (criado_em)"]:::part
    P1 -.-> G1["🔍 Índice GIN (dados_alterados JSONB)"]:::part

    M --> RLS["🔒 Row-Level Security (RLS)<br/>POLICY: usuario = current_user"]:::sec

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Diretor de Segurança & Compliance Bancário)

“Nossa tabela de logs de auditoria tem 50 milhões de registros. As consultas do time de compliance levam mais de 3 minutos para rodar porque o banco faz varredura completa de disco. Além disso, cada usuário só pode ter permissão de enxergar os seus próprios logs (exigência do Banco Central), e não podemos confiar apenas no backend para fazer esse filtro — a segurança precisa estar blindada na própria camada do banco de dados!”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

ID Tipo Descrição Origem no Briefing
RF01 Funcional Particionar a tabela de auditoria por mês para acelerar consultas temporais. “consultas levam mais de 3 minutos”
RF02 Funcional Aplicar Row-Level Security (RLS) para que cada usuário veja apenas seus próprios registros. “cada usuário só pode enxergar seus logs”
RF03 Funcional Indexar colunas JSONB com índices GIN para busca instantânea de campos flexíveis. “dados de auditoria complexos”
RNF01 Não-Funcional Partition Pruning ativo: o banco só deve ler os arquivos em disco do mês solicitado. Performance / DBA
RNF02 Não-Funcional Índices BRIN (Block Range Index) com consumo de menos de 1% do espaço em disco de um B-Tree convencional. Eficiência de Armazenamento

📋 Fase 2 — Backlog & User Stories

ID User Story Prioridade
US01 Como auditor, quero consultar os eventos de um mês específico em menos de 100ms via Partition Pruning. Alta
US02 Como compliance officer, quero ter a garantia de que as políticas de RLS impedem vazamento de dados entre usuários. Alta
US03 Como DBA, quero descartar partições com mais de 5 anos em 1 milissegundo sem travar o banco. Média

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-partitioning-rls

# Subir o ambiente Enterprise
docker-compose up -d

# Conectar como DBA
docker exec -it db_enterprise_postgres psql -U dba_master -d enterprise_db

🛠️ Fase 4 — Implementação Passo a Passo (sql/01_partitioning.sql)

1. Tabela Particionada e Partições Mensais

CREATE TABLE logs_auditoria (
    id BIGSERIAL,
    usuario VARCHAR(100) NOT NULL,
    acao VARCHAR(50) NOT NULL,
    dados_alterados JSONB,
    criado_em DATE NOT NULL,
    PRIMARY KEY (id, criado_em)
) PARTITION BY RANGE (criado_em);

-- Partição do Mês 01/2026
CREATE TABLE logs_auditoria_2026_01 PARTITION OF logs_auditoria
    FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');

2. Índices BRIN e Row-Level Security (RLS)

-- Índice ultra-leve para séries temporais
CREATE INDEX idx_logs_data_brin ON logs_auditoria USING BRIN (criado_em);

-- Isolamento no próprio motor do banco
ALTER TABLE logs_auditoria ENABLE ROW LEVEL SECURITY;

CREATE POLICY policy_usuario_ve_apenas_seus_logs ON logs_auditoria
    FOR SELECT
    USING (usuario = current_user);

🧭 Decisões Técnicas (ADRs)


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd db_tuning_04_dba_enterprise

2. Execute a aplicação ou testes

docker-compose up -d
# Gerar 10.000 registros sintéticos para testes de carga:
python scripts/02_bulk_data_generator.py

# Executar a suíte de testes automatizados:
python -m unittest tests/test_dba_enterprise.py

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/db_tuning_04_dba_enterprise


🧪 Testes de Validação com EXPLAIN ANALYZE

-- Validar que o otimizador só consulta a partição do mês 01 (Partition Pruning)
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM logs_auditoria 
WHERE criado_em BETWEEN '2026-01-10' AND '2026-01-20';

✅ Checkpoint Final

  1. O plano de execução confirma a leitura exclusiva da partição alvo (Partition Pruning).
  2. As políticas de Row-Level Security barram consultas cruzadas mesmo sem filtro WHERE na aplicação.
  3. Os índices BRIN reduzem drasticamente o uso de memória e disco.
  4. Suíte de testes automatizados com 100% de aprovação.
  5. Docker Compose pronto para deploy corporativo.

⬅️ Ver Todos os Projetos no Super-Hub 🏠 Página Inicial do Portal