As materialized views pré-calculam e armazenam resultados de consultas. Assim, o AnalyticDB for MySQL retorna esses dados diretamente, sem reexecutar junções e agregações complexas entre várias tabelas a cada consulta. Este tópico explica como criar uma materialized view, escolher o tipo de atualização e resolver erros comuns.
Pré-requisitos
Antes de começar, verifique se:
A versão do kernel do cluster é 3.1.3.4 ou posterior. Para verificar ou atualizar a versão, acesse a seção Configuration Information na página Cluster Information no console do AnalyticDB for MySQL.
-
Sua conta de banco de dados tem todas as permissões necessárias:
Permissão CREATE nas tabelas do banco de dados de destino.
Permissão SELECT em todas as colunas (ou em colunas específicas) de cada tabela base referenciada pela materialized view.
-
Para materialized views com atualização automática, também são necessárias:
Permissão para conectar a partir de
'%'(qualquer endereço IP).Permissão INSERT na materialized view ou em todas as tabelas do banco de dados correspondente.
Escolher um tipo de atualização
O AnalyticDB for MySQL oferece dois tipos de atualização. A escolha define quais recursos SQL o corpo da consulta pode usar e como a materialized view mantém a sincronização com as tabelas base.
|
Atualização completa |
Atualização rápida (incremental) |
|
|
Funcionamento |
Substitui todos os dados na materialized view |
Aplica apenas as alterações desde a última atualização |
|
Tabelas base |
Tabelas internas, tabelas externas, materialized views existentes e views |
Apenas tabelas internas |
|
Suporte a SQL |
Sintaxe SELECT completa |
Subconjunto do SELECT (consulte Restrições de consulta para MV incremental) |
|
Gatilhos de atualização |
Atualização automática agendada, atualização automática ao sobrescrever a tabela base ou atualização manual |
Apenas atualização automática agendada (intervalo: 5 segundos a 5 minutos) |
|
Versão mínima |
3.1.3.4 |
3.1.9.0 (tabela única); 3.2.1.0 (várias tabelas) |
Preparar tabelas base
Os exemplos deste tópico usam as duas tabelas abaixo. Crie-as antes de executar os exemplos de materialized view.
/*+ 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
);
Os exemplos não especificam um grupo de recursos. Sem essa definição, o AnalyticDB for MySQL usa os recursos computacionais reservados do grupo de recursos interativo padrão para criar e atualizar materialized views. Para usar um grupo de recursos de jobs, consulte Usar recursos elásticos .
Criar uma materialized view com atualização completa
Materialized views com atualização completa aceitam a sintaxe SELECT completa e podem referenciar tabelas internas, tabelas externas, materialized views existentes e views.
O exemplo a seguir cria uma materialized view chamada join_mv, que une customer e sales com configuração para atualização manual:
CREATE MATERIALIZED VIEW join_mv
REFRESH COMPLETE ON DEMAND
AS
SELECT
sale_id,
SUM(price * quantity) AS price
FROM customer
INNER JOIN (SELECT sale_id, customer_id, price, quantity FROM sales) sales
ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id;
Para atualizar a view manualmente, execute:
REFRESH MATERIALIZED VIEW join_mv;
Criar uma materialized view rápida (incremental)
Materialized views rápidas aplicam somente as mudanças desde a última atualização. Isso aumenta a eficiência em grandes conjuntos de dados com alterações incrementais. A contrapartida é um conjunto mais restrito de recursos SQL compatíveis: o conteúdo da consulta SELECT determina se a atualização incremental será aplicada (consulte Restrições de consulta para MV incremental).
Requisito de versão: 3.1.9.0 ou posterior (tabela única); 3.2.1.0 ou posterior (várias tabelas).
Ativar binary logging
A atualização incremental depende do binary logging para rastrear alterações nas tabelas base. Ative-o no nível do cluster e para cada tabela base:
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
Se a ativação do binary logging falhar, consulte Não é possível criar materialized view FAST.
Criar uma materialized view rápida de tabela única
O exemplo abaixo cria uma materialized view rápida chamada sales_mv_incre na tabela sales, com intervalo de atualização automática de 3 minutos:
CREATE MATERIALIZED VIEW sales_mv_incre
REFRESH FAST NEXT now() + INTERVAL 3 minute
AS
SELECT
sale_id,
SUM(price * quantity) AS price
FROM sales
GROUP BY sale_id;
Criar uma materialized view rápida de várias tabelas
Em clusters com versão V3.2.1.0 ou superior, materialized views rápidas podem unir múltiplas tabelas. O exemplo a seguir une customer e sales:
CREATE MATERIALIZED VIEW join_mv_incre
REFRESH FAST NEXT now() + INTERVAL 3 minute
AS
SELECT
customer.customer_id,
SUM(sales.price) AS price
FROM customer
INNER JOIN (SELECT customer_id, price FROM sales) sales
ON customer.customer_id = sales.customer_id
GROUP BY customer.customer_id;
Observação
Se uma tabela base sofrer uma operação TRUNCATE ou INSERT OVERWRITE, ou se ocorrer uma anomalia interna que possa comprometer a integridade dos dados, a materialized view incremental reverte automaticamente para uma atualização completa única. Após a conclusão bem-sucedida dessa atualização completa, as atualizações seguintes retomam automaticamente o modo incremental.
Para a sintaxe completa de CREATE MATERIALIZED VIEW, consulte CREATE MATERIALIZED VIEW.
Monitorar o progresso da criação
Uma instrução CREATE MATERIALIZED VIEW pode levar algum tempo porque inclui um carregamento inicial de dados. Execute a consulta abaixo para listar as materialized views em criação:
SHOW PROCESSLIST WHERE info LIKE '%CREATE MATERIALIZED VIEW%';
Cada linha representa uma materialized view em andamento. O campo User exibe a conta do banco de dados, State indica o status atual e Info contém a instrução CREATE completa. Para definições dos campos, consulte SHOW PROCESSLIST.
Quando SHOW PROCESSLIST não retornar linhas, a materialized view foi criada, incluindo esquema e dados iniciais.
Usar recursos elásticos para criar ou atualizar materialized views
Por padrão, o AnalyticDB for MySQL usa os recursos computacionais reservados do grupo de recursos interativo padrão (user_default) para criar e atualizar materialized views. Para evitar concorrência com cargas de trabalho interativas, use um grupo de recursos de jobs.
Quando usar recursos elásticos:
Para isolar a criação e a atualização de materialized views das consultas interativas.
Para evitar a compra antecipada de recursos dedicados.
Contrapartida: Grupos de recursos de jobs provisionam recursos computacionais sob demanda. Isso adiciona uma sobrecarga de inicialização de segundos a minutos antes de cada atualização, em comparação aos grupos de recursos interativos.
Requisitos do cluster:
Enterprise Edition, Basic Edition ou Data Lakehouse Edition.
V3.1.9.3 ou posterior.
Especifique um grupo de recursos de jobs com MV_PROPERTIES. O exemplo a seguir cria uma materialized view usando o grupo de recursos de jobs my_job_rg com alta prioridade e atualização diária:
CREATE MATERIALIZED VIEW job_mv
MV_PROPERTIES='{
"mv_resource_group": "my_job_rg",
"mv_refresh_hints": {"query_priority": "HIGH"}
}'
REFRESH COMPLETE ON DEMAND
START WITH now()
NEXT now() + INTERVAL 1 DAY
AS
SELECT * FROM customer;
Para limitar os recursos máximos usados durante a atualização, adicione "elastic_job_max_acu": "<value>" a mv_refresh_hints. Para a lista completa de opções de mv_properties, consulte mv_properties.
Mecanismos de gatilho de atualização
Uma materialized view reflete os dados da última atualização, não o estado atual das tabelas base. Escolha o gatilho de atualização conforme a necessidade de dados atualizados:
Atualização automática agendada: Executa atualizações em intervalos fixos (por exemplo, a cada 3 minutos ou diariamente). Compatível com atualização completa e rápida.
Atualização automática ao sobrescrever tabela base: Dispara uma atualização quando uma tabela base é sobrescrita. Compatível apenas com atualização completa.
Atualização manual: Execute
REFRESH MATERIALIZED VIEW <view_name>;sempre que necessário. Compatível apenas com atualização completa.
Para detalhes sobre políticas de atualização e sintaxe de atualização manual, consulte Atualizar materialized views.
Restrições de consulta para MV incremental
O corpo da consulta SELECT de uma materialized view rápida tem restrições inexistentes nas views de atualização completa. A restrição mais limitante é:
Apenas INNER JOIN é compatível. As colunas de junção devem ser colunas originais das tabelas base, ter tipos de dados idênticos e estar indexadas. É possível unir até cinco tabelas base.
Se alguma restrição impedir o seu caso de uso, opte por uma materialized view de atualização completa. Ela aceita a sintaxe SELECT integral sem restrições de junção.
A tabela a seguir lista todos os recursos SQL incompatíveis.
|
Recurso |
Compatível? |
Observações |
|
INNER JOIN (várias tabelas) |
Sim (V3.2.1.0+) |
Até 5 tabelas; colunas de junção devem ser indexadas e ter tipos de dados correspondentes |
|
UNION ALL |
Sim (V3.2.5.0+) |
Requer estrutura especial de consulta (veja abaixo) |
|
COUNT, SUM, MAX, MIN, AVG, APPROX_DISTINCT, COUNT(DISTINCT) |
Sim |
Todas as outras funções de agregação são incompatíveis |
|
AVG com DECIMAL |
Não |
Use outro tipo numérico |
|
COUNT(DISTINCT) com não-INTEGER |
Não |
Compatível apenas com o tipo INTEGER |
|
Funções de janela |
Não |
— |
|
Cláusula HAVING |
Não |
— |
|
Cláusula ORDER BY |
Não |
— |
|
Expressões não determinísticas (NOW(), RAND()) |
Não |
— |
|
UNION, EXCEPT, INTERSECT |
Não |
UNION ALL é compatível a partir da V3.2.5.0 |
|
Tabelas XUANWU_V2 como tabelas base |
Não (antes da V3.2.6.0) |
XUANWU_V2 aceita binary logging a partir da V3.2.6.0 |
|
Tabelas particionadas como tabelas base |
Não (antes da V3.2.3.0) |
— |
|
INSERT OVERWRITE ou TRUNCATE em tabelas base |
Não (antes da V3.2.3.1) |
Retorna um erro |
|
MAX(), MIN(), APPROX_DISTINCT(), COUNT(DISTINCT) com DELETE/UPDATE/REPLACE/INSERT ON DUPLICATE KEY UPDATE |
Não |
Tabelas base aceitam apenas INSERT |
|
MV rápida como tabela base (MVs rápidas aninhadas) |
Sim (V3.2.5.0+) |
Requer binary logging ativado na materialized view |
Para unir mais de cinco tabelas em uma materialized view rápida, entre em contato com o suporte técnico.
Regras para colunas SELECT
As colunas na lista SELECT devem obedecer às seguintes regras:
-
Com GROUP BY e funções de agregação: Inclua todas as colunas do GROUP BY na lista SELECT.
-
Com funções de agregação e sem GROUP BY: A lista SELECT pode conter apenas colunas de agregação ou apenas colunas constantes e de agregação.
-
Sem agregação: Inclua todas as colunas de chave primária da tabela base.
-
Consultas UNION ALL: Cada ramificação deve gerar uma coluna chamada
union_all_markercom um valor constante distinto por ramificação. Inclua todas as colunas de chave primária da tabela base. A chave primária da materialized view deve incluir tanto as colunas de chave primária da tabela base quantounion_all_marker.CREATE MATERIALIZED VIEW demo_union_all_mv (PRIMARY KEY(id, union_all_marker)) REFRESH FAST NEXT now() + INTERVAL 5 minute AS SELECT customer_id AS id, "customer" AS union_all_marker FROM customer UNION ALL SELECT sale_id AS id, "sales" AS union_all_marker FROM sales; Colunas de expressão: Todas as colunas de expressão na lista SELECT devem ter aliases, por exemplo
SUM(price) AS total_price.
Limites
Limites gerais
Estes limites aplicam-se a todas as materialized views.
Não é possível executar INSERT, DELETE ou UPDATE em uma materialized view.
Não é possível excluir ou renomear uma tabela base ou suas colunas enquanto uma materialized view as referencia. Exclua primeiro a materialized view e depois modifique a tabela base.
-
Limite máximo de materialized views por cluster:
V3.1.4.7 ou posterior: 64.
Anterior à V3.1.4.7: 8.
Para aumentar a cota, entre em contato com o suporte técnico.
Limites para materialized views de atualização completa
Ao adicionar ou remover nós reservados, os jobs assíncronos são desativados. Como a atualização completa é um job assíncrono, ela não pode ser executada durante o dimensionamento de nós. A atualização rápida não é afetada.
Limites para materialized views rápidas (incrementais)
Consulte Restrições de consulta para MV incremental para obter a lista completa de restrições SQL.
Gatilho de atualização: Apenas a atualização automática agendada é compatível. O intervalo deve ser entre 5 segundos e 5 minutos.
Limitações de junções de várias tabelas em materialized views incrementais:
É possível unir até cinco tabelas base.
-
Para ajustar esse limite, para entrar em contato com o suporte técnico, considerando as especificações do seu cluster.
Apenas INNER JOIN é compatível.
As colunas de junção devem ser colunas originais das tabelas base, ter tipos de dados idênticos e estar indexadas.
Perguntas frequentes
Como manter apenas o ano mais recente de dados em uma materialized view?
Use uma coluna de data como chave de partição (PARTITION BY) e defina um valor de LIFECYCLE para limitar quantas partições são retidas. Para uma view particionada por dia, defina LIFECYCLE 365 para manter as 365 partições mais recentes (um ano).
Exemplo: a tabela sales recebe novos registros diariamente, particionados por sale_date:
CREATE MATERIALIZED VIEW sales_mv_lifecycle
PARTITION BY VALUE(DATE_FORMAT(sale_date, '%Y%m%d')) LIFECYCLE 365
REFRESH FAST NEXT now() + INTERVAL 100 second
AS
SELECT
sale_date,
SUM(price * quantity) AS price
FROM sales
GROUP BY sale_date;
Solução de problemas
Erro de execução de consulta: Can not create FAST materialized view, because demotable doesn't support getting incremental data
O binary logging não está habilitado para a tabela base demotable. Habilite-o com:
ALTER TABLE demotable binlog=true;
Se você vir XUANWU_V2 engine not support ALTER_BINLOG_ENABLE now, a tabela base usa o mecanismo XUANWU_V2 e o cluster executa uma versão de kernel anterior à V3.2.6.0. O XUANWU_V2 aceita binary logging a partir da versão de kernel V3.2.6.0. Atualize o cluster para V3.2.6.0 ou posterior e execute ALTER TABLE demotable binlog=true; novamente para habilitar o binary logging na tabela base.
Erro de execução de consulta: PRIMARY KEY id must output to MV
Sua materialized view rápida usa uma consulta não agregada sem GROUP BY. Nesse caso, a lista SELECT deve incluir todas as colunas de chave primária da tabela base.
Incorreto (ausência de sale_id, que é a chave primária de sales):
CREATE MATERIALIZED VIEW wrong_example1
REFRESH FAST ON DEMAND
NEXT now() + interval 200 second
AS
SELECT product_id, price
FROM sales;
Adicione a coluna de chave primária:
CREATE MATERIALIZED VIEW correct_example1
REFRESH FAST ON DEMAND
NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;
Erro de execução de consulta: MV PRIMARY KEY must be equal to base table PRIMARY KEY
Sua materialized view rápida usa uma consulta não agregada sem GROUP BY, e a definição da chave primária da materialized view inclui colunas que não fazem parte da chave primária da tabela base.
Incorreto (product_id não é uma coluna de chave primária de sales):
CREATE MATERIALIZED VIEW wrong_example2
(PRIMARY KEY(sale_id, product_id))
REFRESH FAST ON DEMAND
NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;
Remova colunas que não são chave primária da definição da chave primária:
CREATE MATERIALIZED VIEW correct_example2
(PRIMARY KEY(sale_id))
REFRESH FAST ON DEMAND
NEXT now() + interval 200 second
AS
SELECT sale_id, product_id, price
FROM sales;
Erro de execução de consulta: FAST materialized view must define PRIMARY KEY
Este erro tem duas causas possíveis:
-
Nenhuma chave primária válida definida. Atualize a definição da materialized view para atender a estas regras:
Consulta agregada agrupada (com GROUP BY): a chave primária deve corresponder às colunas do GROUP BY (por exemplo, se
GROUP BY a, b, definaPRIMARY KEY(a, b)).Consulta agregada não agrupada (sem GROUP BY): a chave primária deve ser uma constante.
Consulta não agregada: a chave primária deve corresponder exatamente à chave primária da tabela base (por exemplo, se a tabela base tiver
PRIMARY KEY(sale_id, sale_date), a view também deve terPRIMARY KEY(sale_id, sale_date)).
Uma função foi aplicada a uma coluna de chave primária. Remova a função da coluna de chave primária na consulta.
Erro de execução de consulta: The join graph is not supported
As colunas de junção têm tipos de dados incompatíveis. Por exemplo, se customer.id e sales.id tiverem tipos diferentes, a junção falhará. Alinhe os tipos com:
ALTER TABLE tablename MODIFY COLUMN columnname newtype;
Para mais informações, consulte Alterar o tipo de dados de uma coluna.
Erro de execução de consulta: Unable to use index join to refresh this fast MV
As colunas de junção não possuem índices. Adicione um índice em cada coluna de junção:
ALTER TABLE tablename ADD KEY idx_name(columnname);
Para mais informações, consulte Criar um índice.
Erro de execução de consulta: Query exceeded reserved memory limit
A consulta excedeu o limite de memória por nó. Use o recurso de Diagnóstico SQL para identificar estágios e operadores com alto consumo de memória (Agregação, TopN, Janela e Junção são os causadores mais comuns) e otimize esses operadores. Consulte também Métricas de memória e Usar detalhes de estágio e tarefa para analisar consultas.
Próximos passos
Materialized views — conceitos, casos de uso e atualizações de recursos.
CREATE MATERIALIZED VIEW — referência completa de sintaxe.
Atualizar materialized views — políticas de atualização, gatilhos e atualização manual.
Gerenciar materialized views — consultar definições, histórico de atualizações, listar e excluir.
Consultar dados de uma materialized view — sintaxe de consulta e exemplos.