Todos os produtos
Search
Central de documentação

AnalyticDB:Create a materialized view

Última atualização: Jul 10, 2026

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.

Visualize resultados de exemplo

Saída de exemplo:

+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+
|Id     |ProcessId          |User   |Host                |DB     |Command            |Time|State    |Info                           |
+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+
|31801  |20250127144727...  |wenjun |21.17.xx.xx:49534   |demo1  |INSERT_FROM_SELECT |2   |RUNNING  |CREATE MATERIALIZED VIEW join_mv|
|       |                   |       |                    |       |                   |    |         |REFRESH COMPLETE ON DEMAND     |
|       |                   |       |                    |       |                   |    |         |AS ...                         |
+-------+-------------------+-------+--------------------+-------+-------------------+----+---------+-------------------------------+

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 é:

Importante

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.

    Visualize exemplos

    Exemplo correto (todas as colunas GROUP BY incluídas):

    CREATE MATERIALIZED VIEW demo_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- GROUP BY column
      sale_date,  -- GROUP BY column
      max(quantity) AS max,  -- expression columns require aliases
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;

    Incorreto (coluna GROUP BY ausente: sale_date):

    CREATE MATERIALIZED VIEW false_mv1
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales
    GROUP BY sale_id, sale_date;  -- sale_date is in GROUP BY but not in 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.

    Visualize exemplos

    -- Aggregate columns only
    CREATE MATERIALIZED VIEW demo_mv2
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
    
    -- Constant plus aggregate columns (the constant becomes the primary key)
    CREATE MATERIALIZED VIEW demo_mv3
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      1 AS pk,
      max(quantity) AS max,
      sum(price) AS sum
    FROM sales;
  • Sem agregação: Inclua todas as colunas de chave primária da tabela base.

    Visualize exemplos

    -- Single primary key
    CREATE MATERIALIZED VIEW demo_mv4
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,   -- primary key column of base table sales
      quantity
    FROM sales;
    
    -- Composite primary key: PRIMARY KEY(sale_id, sale_date)
    CREATE MATERIALIZED VIEW demo_mv5
    REFRESH FAST ON DEMAND
     NEXT now() + INTERVAL 3 minute
    AS
    SELECT
      sale_id,    -- first primary key column
      sale_date,  -- second primary key column
      quantity
    FROM sales1;
  • Consultas UNION ALL: Cada ramificação deve gerar uma coluna chamada union_all_marker com 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 quanto union_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, defina PRIMARY 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 ter PRIMARY 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