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:

  1. REFRESH ON COMMIT: A Materialized View é atualizada sempre que uma transação é cometida.
  2. REFRESH ON DEMAND: A Materialized View é atualizada apenas quando explicitamente solicitado.
  3. REFRESH FAST: Utiliza logs de mudanças para atualizar apenas as linhas modificadas.
  4. REFRESH COMPLETE: Recria toda a Materialized View a partir da consulta base.
  5. 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
    Onde 1/24 representa uma hora e 1/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
  1. 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';
    
  2. 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';
    
  3. 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:

  1. Agregações: Pré-computar somas, médias e outras agregações para acelerar as consultas.
  2. Filtragem: Armazenar subconjuntos específicos de dados para reduzir o tempo de consulta.
  3. 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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima