Views e Materialized Views em Bancos de Dados

No desenvolvimento e na engenharia de dados, nem sempre queremos (ou devemos) dar acesso direto às tabelas brutas do banco de dados. Às vezes, uma tabela é complexa demais, contém informações sensíveis ou exige JOINs exaustivos que os analistas precisam repetir todo dia.

Para resolver isso, utilizamos as Views (ou Visões).

O que é uma View?

Uma view (ou visão) é uma tabela virtual criada a partir de uma consulta SQL. Ela não armazena dados por si mesma, em vez disso, é uma “janela” que sempre exibe o resultado de uma query pré-definida, como se fosse uma tabela real.

Pense em uma view como um atalho salvo para uma consulta complexa. Quando você consulta uma view, o banco de dados executa a query por trás dela e retorna o resultado, como se você estivesse consultando uma tabela comum.

Veja como uma view se posiciona na arquitetura de um banco de dados:

Por que criar uma view?

1. Simplicidade e reutilização

Queries longas e com muitos JOINs podem ser encapsuladas em uma view e reutilizadas em vários lugares, sem repetição de código.

2. Segurança e controle de acesso

Views permitem expor apenas os dados que um usuário ou sistema pode ver, sem dar acesso direto às tabelas.

3. Abstração e manutenção

Se a estrutura do banco mudar, você atualiza apenas a view — as aplicações que a consomem não precisam saber o que mudou por baixo.

Como criar uma view: Exemplos práticos

Exemplo 1 — Criando uma view simples

-- Criando uma view simples
CREATE VIEW resumo_clientes AS
SELECT
    c.id,
    c.nome,
    COUNT(p.id) AS total_pedidos,
    SUM(p.valor) AS valor_total
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
GROUP BY c.id, c.nome;

-- Consultando a view como se fosse uma tabela
SELECT * FROM resumo_clientes WHERE valor_total > 1000;

Exemplo 2 — relatório de vendas por mês:

CREATE VIEW vendas_mensais AS
SELECT
    DATE_TRUNC('month', data_pedido) AS mes,
    COUNT(*) AS quantidade_pedidos,
    SUM(total) AS receita_total,
    AVG(total) AS ticket_medio
FROM pedidos
WHERE status = 'concluido'
GROUP BY DATE_TRUNC('month', data_pedido)
ORDER BY mes DESC;

-- Uso:
SELECT * FROM vendas_mensais WHERE mes >= '2024-01-01';

Neste vídeo, falo sobre como criar uma View no phpMyAdmin para otimizar consultas no banco de dados de forma simples e eficiente:

Materialized Views: Quando performance importa

Views comuns executam a query toda vez que são consultadas. Para queries muito pesadas, existe o conceito de materialized view, que armazena fisicamente o resultado e pode ser atualizada periodicamente.

-- PostgreSQL: criando uma materialized view
CREATE MATERIALIZED VIEW estatisticas_diarias AS
SELECT
    DATE(criado_em) AS dia,
    COUNT(*) AS novos_usuarios,
    SUM(receita) AS receita_do_dia
FROM eventos
GROUP BY DATE(criado_em);

-- Atualizando os dados armazenados
REFRESH MATERIALIZED VIEW estatisticas_diarias;

É importante conhecer essa diferença, especialmente se você trabalha com grandes volumes de dados:

  • View Comum: É apenas um “atalho”. Toda vez que você a chama, o banco executa o SELECT original. Se a tabela base mudar, a View reflete a mudança na hora.
  • Materialized View (View Materializada): Muito comum em Data Warehouses (como Snowflake, Oracle ou Redshift). Ela salva o resultado da consulta fisicamente no disco.
    • Vantagem: É infinitamente mais rápida para leitura em tabelas gigantes.
    • Desvantagem: Os dados podem ficar desatualizados (é necessário dar um “refresh” manual ou agendado para atualizar os dados).

Qual é a diferença entre uma View, um Tabela e uma consulta AD-HOC?

  • Tabelas: São estruturas físicas que armazenam dados diretamente no banco. Elas são a base de qualquer banco de dados relacional.
  • Views: São consultas armazenadas que não armazenam dados por si mesmas, servindo como uma camada de abstração para facilitar o acesso a informações complexas.
  • Consultas ADHOC: Uma consulta SQL que é executada de forma esporádica ou para responder a uma necessidade específica, sem estar previamente salva como uma view ou estrutura fixa.

💡 Quando usar uma View?
Se você deseja simplificar consultas, ocultar dados sensíveis ou organizar melhor as informações sem criar cópias dos dados.

💡 Quando usar uma Tabela?
Sempre que precisar armazenar dados de forma persistente e garantir que sejam acessados com alta performance.

💡 Quando usar uma Consulta ADHOC?
Sempre que precisar responder alguma pergunta temporária que não precisa ser consumida posteriormente

SituaçãoUsar view?
Query complexa repetida em vários lugares✅ Sim
Controle de acesso a colunas sensíveis✅ Sim
Simplificar a interface para outras equipes✅ Sim
Query pesada consultada com muita frequência✅ Materialized view
Precisa inserir/atualizar dados diretamente⚠️ Com cuidado (views simples permitem, views com JOIN geralmente não)
Compartilhe nas redes sociais:
Alexandre Polselli
Alexandre Polselli

Escrevo artigos e desenvolvo projetos nas minhas áreas de maior interesse: Engenharia de Dados e Data Science.

Artigos: 56