📚 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 catalogo_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';


🏛️ Arquitetura Visual & Engenharia de Dados

A arquitetura abaixo demonstra o fluxo de persistência, otimização e isolamento dos componentes na subpasta sql/:

Arquitetura do Banco de Dados

flowchart TD
    subgraph DDL["Modelagem & Schema (DDL)"]
        S1["Tabelas / Coleções"] --> S2["Constraints & Índices"]
    end
    subgraph DML["Regras & Automação (DML / PL)"]
        R1["Triggers / Aggregations"] --> R2["Procedimentos Transacionais"]
    end
    subgraph Perf["Otimização & Armazenamento"]
        P1["Planos EXPLAIN / Partições"] --> P2["Garantia de ACID / TTL"]
    end
    subgraph Homolog["Homologação & Qualidade"]
        Q1["Docker Compose & Scripts"] --> Q2["Checkpoints CP-01..05 PASS"]
    end

    DDL --> DML
    DML --> Perf
    Perf --> Homolog

    style DDL fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
    style DML fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
    style Perf fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
    style Homolog fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

ID Persona História de Usuário Critério de Aceite Prioridade
US-01 DBA Enterprise Desejo diagnosticar gargalos de execução com EXPLAIN (ANALYZE, BUFFERS) Identificar leituras sequenciais (Seq Scan) e custos de buffers de memória Alta
US-02 Arquiteto de Dados Desejo particionamento declarativo por RANGE de datas para tabelas massivas Particionamento de logs/faturamento com eliminação de partições (partition pruning) Alta
US-03 Engenheiro de Segurança Desejo Row Level Security (RLS) isolando dados por tenant Políticas CREATE POLICY forçando isolamento de clientes no nível do motor Alta
US-04 Analista de Infraestrutura Desejo configurar PgBouncer para connection pooling eficiente Gerenciamento de conexões transacionais reduzindo overhead de fork no Postgres Média
US-05 Auditor de Performance Desejo suíte de testes comparando planos de execução antes e depois do tuning Testes automatizados comprovando redução de custo de plano em mais de 70% Média

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Análise aprofundada de planos de execução com EXPLAIN ANALYZE Alta
RF-02 Particionamento de tabelas por intervalo temporal com manutenção automática Alta
RF-03 Implementação de Row Level Security (RLS) com políticas multi-tenant Alta
RF-04 Estratégia de índices especializados (BRIN, B-Tree e Parciais) Média
RF-05 Scripts de auditoria e validação de performance em sql/ Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Redução mensurável de I/O em consultas históricas particionadas Alta
RNF-02 Impossibilidade de vazamento de dados inter-tenant mesmo em queries genéricas Alta
RNF-03 Zero downtime na criação de novos índices (CREATE INDEX CONCURRENTLY) Alta
RNF-04 Conformidade estrita com padrões de administração PostgreSQL 16 Média
RNF-05 Scripts consolidados na pasta sql/ Alta

🔗 Matriz de Rastreabilidade (RTM)

User Story Requisito Funcional Requisito Não-Funcional Módulo / Artefato de Código Status de Homologação
US-01 RF-01 RNF-01, RNF-04 sql/01_explain_analysis.sql Testado
US-02 RF-02 RNF-01, RNF-03 sql/02_partitioning.sql Testado
US-03 RF-03 RNF-02, RNF-04 sql/03_rls_security.sql Testado
US-04 RF-04 RNF-01, RNF-04 sql/04_specialized_indexes.sql Testado
US-05 RF-05 RNF-01, RNF-05 tests/test_tuning.py Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Subida Conteinerizada do Ambiente docker-compose.yml PASS ✅
CP-02 Criação de Estrutura & Schemas sql/ PASS ✅
CP-03 Automação Transacional & Regras Triggers / Queries PASS ✅
CP-04 Otimização de Performance & Índices Indexes / Tuning PASS ✅
CP-05 Homologação com Suíte de Testes tests/ PASS ✅