Curso
Se você trabalha bastante com SQL (de preferência usando PostgreSQL) para consultar bancos de dados, provavelmente já escreveu várias consultas complexas para responder perguntas críticas. E muitas vezes você precisa usar os resultados dessas consultas com frequência no seu dia a dia. Executar uma consulta complexa várias vezes pode ser caro. E se existisse uma forma de armazenar em cache o resultado de uma consulta complexa para ganhar desempenho? É aí que entram as views materializadas.
Você pode estar pensando que existem também as views simples, que retornam o resultado de uma consulta. Mas uma view simples é diferente de uma view materializada em vários aspectos. Veja o que a documentação oficial do PostgreSQL diz sobre views simples:
A view não é materializada fisicamente. Em vez disso, a consulta é executada toda vez que a view é referenciada em uma consulta.
Isso significa que as views simples não são armazenadas fisicamente no banco. Toda vez que uma view é usada em uma consulta, a consulta que criou a view é executada. É justamente isso que pode tornar as views simples um pouco ineficientes em termos de tempo de acesso.
Por outro lado, as views materializadas trazem bastante flexibilidade ao permitir que você persista uma view fisicamente no banco de dados. E você pode operar sobre views materializadas do mesmo jeito que faria com views simples (mas com menor tempo de acesso). No restante deste tutorial, você vai estudar as views materializadas no PostgreSQL. Em um de seus webinars, o Chief Data Scientist da DataCamp, David Robinson, mostrou como usa views materializadas para armazenar com eficiência os resultados de consultas complexas.
Observação: para acompanhar este tutorial, é importante estar familiarizado com os conteúdos do curso Joining Data in SQL.
Configuração inicial do banco de dados
É melhor configurar um banco no PostgreSQL e criar uma tabela básica para que você possa consultá-la de forma eficiente. Isso também vai ajudar nas próximas seções deste tutorial. Você pode restaurar este backup de banco, que contém a tabela que será usada aqui. Se quiser aprender como restaurar um backup no PostgreSQL, siga a primeira seção deste tutorial.
Se você conseguiu restaurar o backup, deverá ver uma tabela chamada international_debt no banco (você precisará criar um banco antes, caso ainda não tenha um). Vamos dar uma olhada rápida nas primeiras linhas da tabela (uma consulta select simples resolve) -

A tabela traz informações sobre estatísticas de dívida de diferentes países ao redor do mundo no ano corrente, em várias categorias (veja as colunas indicator_name, indicator_code). A coluna debt mostra o valor da dívida (em USD) que um determinado país tem em uma determinada categoria. Esses dados pertencem ao domínio de economia e são usados com frequência para analisar a situação econômica de diversos países. Os dados foram coletados no Banco Mundial.
Agora que você configurou o banco com sucesso, pode seguir para as próximas seções do tutorial.
Criando views materializadas
Vamos criar uma view materializada a partir da seguinte consulta:
select country_name,
sum(debt) as total_debt
from international_debt
group by country_name order by country_name;
A consulta retorna os nomes dos países com suas dívidas totais (em ordem alfabética). A saída deve ficar assim:

Agora a view materializada:
CREATE MATERIALIZED VIEW country_total_debt
as
select country_name,
sum(debt) as total_debt
from international_debt
group by country_name order by country_name;
Você deve receber uma mensagem de sucesso como: Query returned successfully: 124 rows affected, 242 ms execution time.
Atualizando uma view materializada
Você também pode instruir o PostgreSQL a não carregar nenhum dado na view materializada no momento da criação especificando a opção WITH NO DATA:
CREATE MATERIALIZED VIEW country_total_debt_2
as
select country_name,
sum(debt) as total_debt
from international_debt
group by country_name order by country_name
WITH NO DATA;
Você verá a mensagem: Query returned successfully with no result in 41 ms. Note a diferença entre as duas saídas. Ao incluir a opção WITH NO DATA, é criada uma view materializada vazia. Você não consegue consultá-la ainda. Porém, pode preenchê-la executando:
REFRESH MATERIALIZED VIEW country_total_debt_2;
Consultando uma view materializada
Neste ponto, você deve ter duas views materializadas (country_total_debt, country_total_debt_2) criadas. Vamos executar um select simples usando qualquer uma delas:
select * from country_total_debt_2;
A consulta deve retornar algo como:

A saída é exatamente a mesma da consulta que encapsulamos na view materializada. Você também pode executar consultas com funções de agregação sobre views materializadas:
select max(total_debt) from country_total_debt_2;
Você deve obter: 
Excluindo uma view materializada
Views materializadas podem ser excluídas do mesmo jeito que tabelas no PostgreSQL. Você só precisa especificar Materialized View após Drop:
Drop Materialized View country_total_debt_2;
Para comparar o MySQL com seu segundo concorrente mais popular, confira nossa análise detalhada PostgreSQL vs. MySQL.
Conclusão
É isso para este tutorial. Obrigado por ler até o final. Aqui, você aprendeu sobre views materializadas no PostgreSQL e como operar com elas. Pela sua eficácia, as views materializadas são amplamente usadas em data warehousing. Se quiser aprender consultas mais complexas, confira estes cursos da DataCamp:


