Como sabemos, uma view é uma tabela virtual (lógica) cujo conteúdo é baseado no retorno de uma consulta pré-definida, realizada em uma ou mais tabelas (ou outras views), mas que não contém os dados em si.
Materialized view é um objeto de banco de dados que armazena o resultado de uma consulta de forma persistente. É uma tabela auxiliar que permite maior performance no acesso aos dados.
Veja essa consulta com inner join, por exemplo:
select cl.nome, pr.nome, pe.qtd_vendida from pedidos pe inner join clientes cl
on pe.cod_cliente = cl.codigo
inner join produtos pr
on pe.cod_produto = pr.codigo
order by cl.nome;
Para criar uma materializade view, fazemos assim:
create materialized view view_compras as
select cl.nome as nome_cliente, pr.nome as nome_produto, pe.qtd_vendida from pedidos pe inner join clientes cl
on pe.cod_cliente = cl.codigo
inner join produtos pr
on pe.cod_produto = pr.codigo
order by cl.nome
with no data; -- Not data cria a view vazia.
Aí, podemos fazer uma consulta nessa view assim:
select * from view_compras;
Só que ele dará erro por não ter sido recarregada, por isso devemos recarregar ela, assim:
refresh materialized view view_compras;
select * from view_compras;
PS: Ao alterar algo na tabela, devemos atualizar a materialized view também.
Para alterar uma view, fazemos assim:
alter materialized view view_compras
rename column nome_produto to produto;
select * from view_compras;
Para excluir ela, fazemos assim:
drop materialized view view_compras;
Para fazer o backup de um banco de dados, como o da biblioteca exemplificado anteriormente, podemos usar a forma gráfica, clicando no botão direito no banco. Mas nesse exemplo usaremos o terminal.
PS: Você precisa ter permissão para manipular o banco de dados. Acesse o PSQL com o usuário do Postgres com permissões.
Abra o PG_Dump na pasta desejada com esse comando:
pg_dump -U postgres biblioteca > biblioteca_back.bkp
PS: Dependendo do tamanho do banco, pode demorar um pouco.
Vamos excluir o banco para podermos restaurar ele, digitando no PSQL esse comando:
drop database biblioteca;
Ele dará erro por ele está sendo acessado por outros usuários, então vamos desconectar esse banco para podermos excluir ele, além de revogar a conexão, assim:
revoke connect on database biblioteca from public;
select pg_terminate_backend(pg_stat_activity.pid) from pg_stat_activity
where pg_stat_activity.datname = 'biblioteca';
drop database biblioteca;
PS: Dentro do PSQL, use o comando \l
para visualizar os bancos.
Para restaurar o backup, no PSQL crie um novo banco manualmente com o mesmo nome:
create database biblioteca template template0;
E depois restaurar assim, na linha de comando:
psql -U postgres biblioteca < biblioteca_back.bkp;