
O Que é uma Materialized View?
No Oracle, uma Materialized View (MV) é uma cópia física dos dados recuperados por uma consulta SQL. Diferente de uma View normal, que é apenas uma definição de consulta, uma Materialized View armazena os dados fisicamente, permitindo acesso rápido e eficiente, especialmente em ambientes de data warehousing.
Vantagens de Usar Materialized Views
- Desempenho Melhorado: Como os dados são armazenados fisicamente, as consultas sobre uma Materialized View são geralmente muito mais rápidas do que consultas diretas nas tabelas subjacentes.
- Descentralização da Carga de Trabalho: Ajuda a reduzir a carga de trabalho das tabelas base, permitindo que os usuários consultem a Materialized View em vez de acessar diretamente as tabelas.
- Atualizações Periódicas: As Materialized Views podem ser atualizadas periodicamente para refletir as mudanças nos dados subjacentes, mantendo uma consistência de dados aceitável.
- Simplificação de Consultas Complexas: As Materialized Views podem simplificar consultas complexas, encapsulando a lógica em uma única estrutura de dados.
Como Criar uma Materialized View
A criação de uma Materialized View no Oracle é feita através do comando CREATE MATERIALIZED VIEW
. Veja um exemplo básico utilizando as tabelas funcionarios
e cargos
:
CREATE MATERIALIZED VIEW mv_funcionarios AS SELECT f.id, f.nome, f.data_nascimento, f.email, f.codigo_cargo, f.salario, c.descricao AS descricao_cargo FROM funcionarios f JOIN cargos c ON f.codigo_cargo = c.codigo;
Atualização de Materialized Views
As Materialized Views podem ser atualizadas automaticamente usando a cláusula REFRESH
. Existem várias opções de atualização:
- REFRESH ON COMMIT: A Materialized View é atualizada sempre que uma transação é cometida.
- REFRESH ON DEMAND: A Materialized View é atualizada apenas quando explicitamente solicitado.
- REFRESH FAST: Utiliza logs de mudanças para atualizar apenas as linhas modificadas.
- REFRESH COMPLETE: Recria toda a Materialized View a partir da consulta base.
- REFRESH INTERVAL: Permite definir uma atualização periódica baseada em um intervalo de tempo.
Exemplo com REFRESH FAST ON COMMIT
A Materialized View é atualizada sempre que uma transação é cometida.
CREATE MATERIALIZED VIEW mv_funcionarios REFRESH FAST ON COMMIT AS SELECT f.id, f.nome, f.data_nascimento, f.email, f.codigo_cargo, f.salario, c.descricao AS descricao_cargo FROM funcionarios f JOIN cargos c ON f.codigo_cargo = c.codigo;
Exemplo com REFRESH ON DEMAND
A Materialized View é atualizada apenas quando explicitamente solicitado.
CREATE MATERIALIZED VIEW mv_funcionarios REFRESH ON DEMAND AS SELECT f.id, f.nome, f.data_nascimento, f.email, f.codigo_cargo, f.salario, c.descricao AS descricao_cargo FROM funcionarios f JOIN cargos c ON f.codigo_cargo = c.codigo;
Exemplo com REFRESH FAST INTERVAL
Permite definir uma atualização periódica baseada em um intervalo de tempo.
CREATE MATERIALIZED VIEW mv_funcionarios REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 2 AS SELECT f.id, f.nome, f.data_nascimento, f.email, f.codigo_cargo, f.salario, c.descricao AS descricao_cargo FROM funcionarios f JOIN cargos c ON f.codigo_cargo = c.codigo;
Neste exemplo, a Materialized View mv_funcionarios
será atualizada a cada 2 dias, começando a partir da data de criação.
Observação: Para ajustar o intervalo de atualização, você pode modificar o comando NEXT
para diferentes períodos:
- Atualização por Hora: Se você deseja que a Materialized View seja atualizada a cada hora, ajuste o
NEXT
para adicionar uma hora:NEXT SYSDATE + 1/24
- Atualização por Minuto: Se a atualização deve ocorrer a cada minuto, ajuste o
NEXT
para adicionar um minuto:NEXT SYSDATE + 1/1440
Onde1/24
representa uma hora e1/1440
representa um minuto. Esses ajustes permitem que você configure a frequência da atualização conforme as necessidades do seu ambiente.
Exemplo com REFRESH COMPLETE
Recria toda a Materialized View a partir da consulta base.
CREATE MATERIALIZED VIEW mv_funcionarios REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1/24 AS SELECT f.id, f.nome, f.data_nascimento, f.email, f.codigo_cargo, f.salario, c.descricao AS descricao_cargo FROM funcionarios f JOIN cargos c ON f.codigo_cargo = c.codigo;
Consultando Dados de uma Materialized View
Consultar dados de uma Materialized View é similar a consultar uma tabela normal. Veja um exemplo:
SELECT * FROM mv_funcionarios WHERE salario > 5000;
Recompilando uma Materialized View
Às vezes, é necessário recompilar uma Materialized View, especialmente após alterações nas tabelas subjacentes. Isso pode ser feito com o comando ALTER MATERIALIZED VIEW
:
ALTER MATERIALIZED VIEW mv_funcionarios COMPILE;
Excluindo uma Materialized View
Se uma Materialized View não for mais necessária, ela pode ser excluída com o comando DROP MATERIALIZED VIEW
:
DROP MATERIALIZED VIEW mv_funcionarios;
Estratégias de Refresh
As Materialized Views oferecem flexibilidade em termos de quando e como os dados são atualizados. As estratégias de REFRESH
mais comuns são:
- ON COMMIT: Ideal para ambientes onde a consistência dos dados é crucial e as mudanças são relativamente pequenas e frequentes.
- ON DEMAND: Melhor para ambientes onde grandes volumes de dados são alterados, permitindo que o administrador controle quando a atualização ocorre.
- FAST: Utiliza logs de mudanças e é mais eficiente para atualizações incrementais.
- COMPLETE: Recria toda a Materialized View, ideal para quando a eficiência não é um problema e a simplicidade é desejada.
- INTERVAL: Define um intervalo de tempo específico para a atualização automática, útil para dados que mudam periodicamente.
Observações
- Verificação dos Materialized View Logs: Confirme que os logs de Materialized View foram criados corretamente e que incluem as colunas necessárias.
-- Verifique os logs da tabela funcionarios SELECT * FROM all_mviews WHERE mview_name = 'MV_FUNCIONARIOS'; -- Verifique os logs da tabela cargos SELECT * FROM all_mviews WHERE mview_name = 'MV_FUNCIONARIOS';
- Verificação das Colunas nos Logs: Verifique se as colunas que você está usando na Materialized View estão corretamente incluídas nos logs de Materialized View.
-- Verifique as colunas do log para funcionarios SELECT * FROM all_mview_logs WHERE master = 'FUNCIONARIOS'; -- Verifique as colunas do log para cargos SELECT * FROM all_mview_logs WHERE master = 'CARGOS';
- Criação dos Logs para Materialized Views: Para utilizar a opção de
REFRESH FAST
, você deve criar os logs de Materialized View nas tabelas base. Veja como criar os logs:-- Crie o Materialized View Log para a tabela funcionarios CREATE MATERIALIZED VIEW LOG ON funcionarios WITH ROWID, SEQUENCE (id, nome, data_nascimento, email, codigo_cargo, salario) INCLUDING NEW VALUES; -- Crie o Materialized View Log para a tabela cargos CREATE MATERIALIZED VIEW LOG ON cargos WITH ROWID, SEQUENCE (codigo, descricao) INCLUDING NEW VALUES;
Utilização em Data Warehousing
Em ambientes de data warehousing, as Materialized Views são frequentemente usadas para:
- Agregações: Pré-computar somas, médias e outras agregações para acelerar as consultas.
- Filtragem: Armazenar subconjuntos específicos de dados para reduzir o tempo de consulta.
- Transformações: Aplicar transformações complexas aos dados, facilitando a análise.
Considerações Finais
As Materialized Views são uma ferramenta poderosa no Oracle para melhorar o desempenho e a eficiência das consultas em grandes volumes de dados. No entanto, é importante escolher a estratégia de atualização correta e entender as implicações de armazenamento e manutenção para tirar o máximo proveito dessa funcionalidade.
Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!