Visualizações materializadas aceleram consultas complexas ou simplificam processos de ETL. Elas pré-calculam uma consulta definida pelo usuário e armazenam os resultados. Defina uma política de atualização para a visualização materializada com base nos padrões de escrita das tabelas base, na complexidade computacional da consulta (query_body) e nos requisitos de atualização dos dados.
Escolher uma política de atualização
As visualizações materializadas suportam duas políticas de atualização: completa (COMPLETE) e rápida (FAST).
Atualização completa: executa a consulta SQL original para varrer os dados de todas as partições-alvo na tabela base e substitui totalmente os dados antigos pelos novos dados calculados.
Atualização rápida: o sistema reescreve a consulta da visualização (
query_body) para varrer apenas os dados alterados (provenientes de operaçõesINSERT,DELETEeUPDATE) na tabela base e aplica essas alterações à visualização materializada. Isso evita a varredura de toda a tabela base em cada ciclo e reduz o custo computacional de cada atualização.
A tabela a seguir compara os casos de uso, vantagens e limitações das duas políticas de atualização.
Política de atualização | Casos de uso | Características |
Atualização completa | Cenários offline:
| Vantagem: O |
Limitação: permite apenas atualizações completas em lote. | ||
Atualização rápida | Cenários em tempo real:
| Vantagens:
|
Limitações:
|
Escolher um gatilho de atualização
Ao criar uma visualização materializada, defina tanto a política quanto o gatilho de atualização. As visualizações materializadas suportam atualização sob demanda (ON DEMAND) e atualização acionada por sobrescrita (ON OVERWRITE). A atualização sob demanda subdivide-se em agendada e manual. Caso não especifique um gatilho, o padrão será a atualização sob demanda.
Ao escolher um gatilho de atualização, considere seus requisitos de atualização de dados e a carga do cluster. As características e casos de uso para cada gatilho são:
Atualização manual: a visualização materializada não atualiza os dados automaticamente. Execute
REFRESH MATERIALIZED VIEWpara atualizar os dados manualmente. Indicado para cenários onde a consistência dos dados não é alta prioridade ou os dados mudam com pouca frequência.Atualização agendada: a visualização materializada atualiza automaticamente em um horário especificado. Se uma atualização ainda estiver em execução quando a próxima estiver programada para começar, o sistema ignora a nova atualização e aguarda o próximo intervalo. Recomendado para cenários em que os dados da tabela base mudam periodicamente, como novos registros de transações gerados durante períodos diários ou semanais fixos.
Atualização acionada por sobrescrita: a visualização materializada atualiza automaticamente quando uma tabela base é sobrescrita usando
INSERT OVERWRITE. Adequado para cenários com altos requisitos de dados em tempo real e consistência.
Diferentes políticas de atualização suportam diferentes gatilhos, conforme mostra a tabela a seguir:
Política de atualização | Atualização sob demanda (ON DEMAND) | Atualização acionada por sobrescrita (ON OVERWRITE) | |
Atualização manual | Atualização agendada | ||
Atualização completa | ✔️ | ✔️ | ✔️ |
Atualização rápida | ❌ | ✔️ | ❌ |
Definir políticas e gatilhos de atualização
Os exemplos a seguir utilizam as tabelas customer, sales e product para mostrar como definir a política e o gatilho de atualização para uma nova visualização materializada.
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE customer (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
is_vip Boolean
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
price DECIMAL(10, 2),
quantity INT,
sale_date TIMESTAMP
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- Set the table engine to XUANWU.
CREATE TABLE product (
product_id INT PRIMARY KEY,
product_name VARCHAR,
category_id INT,
unit_price DECIMAL(10, 2),
stock_quantity INT
);
Criar uma visualização materializada com atualização completa
Ao criar uma visualização materializada, use a palavra-chave REFRESH COMPLETE para especificar uma política de atualização completa.
Uma visualização materializada com atualização completa suporta atualização manual, agendada e acionada por sobrescrita.
-
Crie uma visualização materializada com atualização completa chamada
compl_mv1. Como esta visualização não define um gatilho de atualização nem um parâmetroNEXT, ela assume como padrão uma atualização sob demanda que deve ser acionada manualmente.CREATE MATERIALIZED VIEW compl_mv1 REFRESH COMPLETE AS SELECT * FROM customer; -
Crie uma visualização materializada com atualização completa chamada
compl_mv2. Esta visualização define uma atualização sob demanda (ON DEMAND) e especifica os horários de atualização inicial (START WITH) e subsequente (NEXT). Neste exemplo, a visualização atualiza automaticamente às 02:00 todos os dias.CREATE MATERIALIZED VIEW compl_mv2 REFRESH COMPLETE ON DEMAND START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') AS SELECT * FROM customer; -
Crie uma visualização materializada com atualização completa chamada
compl_mv3. Esta visualização está configurada para uma atualização acionada por sobrescrita (ON OVERWRITE). Este modo não exige uma cláusulaNEXT.CREATE MATERIALIZED VIEW compl_mv3 REFRESH COMPLETE ON OVERWRITE AS SELECT * FROM customer;
Criar uma visualização materializada com atualização rápida
Ao criar uma visualização materializada, use a palavra-chave REFRESH FAST para especificar uma política de atualização rápida. Uma visualização materializada com atualização rápida suporta apenas atualização agendada.
Ativar log binário
Antes de criar uma visualização materializada com atualização rápida, ative o log binário para o cluster e suas tabelas base.
SET ADB_CONFIG BINLOG_ENABLE=true; -- For clusters with an engine version before 3.2.0.0, run this command to enable binary logging. It is enabled by default in 3.2.0.0 and later.
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
ALTER TABLE product binlog=true;
As operações
INSERT OVERWRITE INTOeTRUNCATEsão suportadas em tabelas com log binário ativado apenas na versão do mecanismo 3.2.0.0 e posteriores.Após criar uma visualização materializada com atualização rápida, não é possível desativar o log binário nas tabelas base.
Depois de excluir uma visualização materializada com atualização rápida, desative manualmente o log binário para o cluster e as tabelas base executando
SET ADB_CONFIG BINLOG_ENABLE=false;eALTER TABLE <table_name> binlog=false;.
Visualizações materializadas de tabela única
-
Crie uma visualização materializada de tabela única
fast_mv1que usa atualização rápida sem operação de agregação e atualiza a cada 10 segundos.CREATE MATERIALIZED VIEW fast_mv1 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT sale_id, sale_date, price FROM sales WHERE price > 10; -
Crie uma visualização materializada de tabela única
fast_mv2que usa atualização rápida com agregação GROUP BY e atualiza a cada 5 segundos.CREATE MATERIALIZED VIEW fast_mv2 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT customer_id, sale_date, -- The system uses the GROUP BY columns as the primary key of the materialized view. COUNT(sale_id) AS cnt_sale_id, -- Aggregate output column. SUM(price * quantity) AS total_revenue, -- Aggregate output column. customer_id / 100 AS new_customer_id -- Non-aggregate output columns can use any expression. FROM sales WHERE ifnull(price, 1) > 0 -- Conditions can use any expression. GROUP BY customer_id, sale_date; -
Crie uma visualização materializada de tabela única
fast_mv3que usa atualização rápida sem agregação GROUP BY e atualiza a cada minuto.CREATE MATERIALIZED VIEW fast_mv3 REFRESH FAST NEXT now() + INTERVAL 1 minute AS SELECT count(*) AS cnt -- The system generates a constant primary key to ensure that the materialized view contains only one record. FROM sales;
Visualizações materializadas de múltiplas tabelas
-
Crie uma visualização materializada de múltiplas tabelas
fast_mv4que usa atualização rápida sem operação de agregação e atualiza a cada 5 segundos.CREATE MATERIALIZED VIEW fast_mv4 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT c.customer_id, c.customer_name, p.product_id, s.sale_id, (s.price * s.quantity) AS revenue FROM sales s JOIN customer c ON s.customer_id = c.customer_id JOIN product p ON s.product_id = p.product_id; -
Crie uma visualização materializada de múltiplas tabelas
fast_mv5que usa atualização rápida com agregação GROUP BY e atualiza a cada 10 segundos.CREATE MATERIALIZED VIEW fast_mv5 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT s.sale_id, c.customer_name, p.product_name, COUNT(*) AS cnt, SUM(s.price * s.quantity) AS revenue, SUM(p.unit_price) AS sum_p FROM sales s JOIN (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id JOIN (SELECT * FROM product WHERE stock_quantity > 0) p ON p.product_id = s.product_id GROUP BY s.sale_id, c.customer_name, p.product_name;
Observação
Se uma tabela base for submetida a uma operação TRUNCATE ou INSERT OVERWRITE, ou se ocorrer uma anomalia interna que possa afetar a correção dos dados, uma visualização materializada incremental reverte automaticamente para uma atualização completa única. Após o sucesso da atualização completa, as atualizações subsequentes retomam automaticamente o modo incremental.
Limitações
As seguintes limitações aplicam-se a visualizações materializadas com atualização rápida:
Em clusters com versão do mecanismo anterior a 3.2.3.0, uma tabela particionada não pode ser tabela base para uma visualização materializada com atualização rápida.
Em clusters com versão do mecanismo anterior a 3.2.3.1, as operações
INSERT OVERWRITEeTRUNCATEnão são suportadas nas tabelas base de uma visualização materializada com atualização rápida. A execução dessas operações causa erro.A atualização rápida suporta apenas atualizações agendadas com intervalo entre 5 segundos (s) e 5 minutos (min).
-
O
query_bodyde uma visualização materializada com atualização rápida possui as seguintes limitações:A visualização materializada deve garantir resultados idênticos aos de uma consulta direta em suas tabelas base e deve suportar todas as alterações DML. Se o
query_bodynão suportar atualização rápida, a instruçãoCREATE MATERIALIZED VIEWretornará erro.As condições não podem conter expressões não determinísticas, como
now()ourand().Apenas as seguintes funções de agregação são suportadas: COUNT, SUM, MAX, MIN, AVG, APPROX_DISTINCT e COUNT(DISTINCT).
Quando o
query_bodyusa a função de agregação MAX, MIN, APPROX_DISTINCT ou COUNT(DISTINCT), apenas operações INSERT são permitidas nas tabelas base. Operações de exclusão de dados, como DELETE, UPDATE, REPLACE e INSERT ON DUPLICATE KEY UPDATE, são proibidas.A palavra-chave DISTINCT não é suportada para funções de agregação diferentes de COUNT(DISTINCT).
COUNT(DISTINCT) suporta apenas o tipo INTEGER.
AVG não suporta o tipo DECIMAL.
A palavra-chave HAVING não é suportada para operações de agregação.
Funções de janela não são suportadas.
Operações de ordenação não são suportadas.
Operações de conjunto como UNION, EXCEPT e INTERSECT não são suportadas.
-
Visualizações materializadas de múltiplas tabelas com atualização rápida têm as seguintes limitações adicionais:
Atualmente, visualizações materializadas de múltiplas tabelas suportam apenas INNER JOIN.
Por padrão, uma visualização materializada de múltiplas tabelas pode unir no máximo cinco tabelas.
As colunas de junção em uma visualização materializada de múltiplas tabelas devem ser colunas originais das tabelas, ter o mesmo tipo de dados e cada coluna de junção deve ter um índice.
Atualizar visualizações materializadas manualmente
Se uma visualização materializada for criada com a política de atualização ON DEMAND e nenhuma cláusula NEXT for definida, ela não atualizará automaticamente. Nesse caso, atualize a visualização materializada manualmente.
REFRESH MATERIALIZED VIEW <mv_name>;
Após enviar uma solicitação de atualização, o sistema adiciona o trabalho de atualização a uma fila em segundo plano. Continue realizando outras operações sem precisar esperar a conclusão da atualização.
Uma mensagem de retorno Query OK ou Success indica que o trabalho de atualização foi enviado com sucesso para a fila.
Consultar registros de atualização
Consultar registros de atualização automática
Execute a seguinte instrução SQL para consultar os registros de atualização automática de uma visualização materializada específica, incluindo hora de início (start_time), hora de término (end_time), status (state) e ID do processo (process_id). Para obter mais informações sobre os campos nos resultados retornados, consulte Gerenciar visualizações materializadas.
SELECT * FROM information_schema.mv_auto_refresh_jobs where mv_name = '<mv_name>';
Consultar registros de atualização manual
-
Para consultar registros de atualização manual dos últimos 30 dias, utilize o recurso de auditoria SQL. Ao consultar, insira a palavra-chave
REFRESH MATERIALIZED VIEWmv_name para encontrar informações como hora, duração, endereço IP e conta do banco de dados para cada atualização manual.O recurso de auditoria SQL deve ser ativado separadamente. Operações SQL ocorridas antes da ativação não são registradas nos logs de auditoria.
Para consultar registros de atualização manual e automática dos últimos 14 dias, utilize o recurso de diagnóstico e otimização de SQL. Ao consultar, insira o nome da visualização materializada, como
compl_mv1, para encontrar informações de todas as consultas SQL relacionadas (incluindo criação, atualização manual, atualização automática e alteração), como hora de início, conta do banco de dados, duração e ID do processo.
Parar um trabalho de atualização em execução
Se um trabalho de atualização demorar muito, pare-o manualmente usando seu ID de processo. Se isso falhar, entre em contato com o suporte técnico.
Observações
Se você parar um trabalho de atualização usando KILL PROCESS <process_id>;, observe que a próxima atualização ainda será acionada no próximo horário agendado ou na próxima sobrescrita da tabela base.
Uso
Para parar um trabalho de atualização que está no estado RUNNING, use o seguinte SQL:
KILL PROCESS <process_id>;
Obtenha o process_id nos registros de atualização da visualização materializada.
Documentos relacionados
Criar uma visualização materializada: Descreve os casos de uso, recursos principais e limitações das visualizações materializadas.
CREATE MATERIALIZED VIEW: Fornece a sintaxe completa.
Gerenciar visualizações materializadas: Explica como consultar definições de visualizações materializadas, consultar registros de atualização, alterar visualizações materializadas e excluir visualizações materializadas.