Cria uma materialized view com suporte opcional a particionamento, clustering e atualização agendada.
Informações básicas
Uma view é uma consulta armazenada executada nas tabelas source sempre que acessada. Já uma materialized view é uma tabela física que armazena resultados de consultas pré-computados. Ela ocupa armazenamento real, mas oferece desempenho de consulta superior ao eliminar operações repetidas de JOIN e agregação.
|
Consulta tradicional |
Consulta com materialized view |
|
|
Instruções de consulta |
Consultas SQL são executadas nas tabelas source a cada acesso. |
A consulta é executada na materialized view pré-computada. Se a reescrita de consulta estiver ativada, o MaxCompute redireciona automaticamente as consultas correspondentes para a materialized view, sem necessidade de alterações no código. |
|
Características da consulta |
Envolve varreduras de tabela, JOINs e filtros em cada execução. Lenta para grandes conjuntos de dados. |
Envolve apenas varreduras de tabela e filtros. Os resultados dos JOINs já estão armazenados. O MaxCompute seleciona automaticamente a materialized view mais eficiente. |
Quando usar uma materialized view
Materialized views são adequadas para os seguintes cenários de consulta:
Consultas executadas frequentemente e que seguem um padrão fixo.
Consultas que envolvem operações demoradas, como JOINs ou agregações.
Consultas que leem apenas uma pequena parte de uma tabela grande.
Se nenhuma dessas condições se aplicar — por exemplo, se o padrão de consulta mudar com frequência ou se o conjunto de dados for pequeno — uma view comum ou uma consulta direta pode ser mais apropriada.
Faturamento
As materialized views geram custos em duas categorias:
Armazenamento
Materialized views ocupam armazenamento físico. As cobranças são baseadas no espaço de armazenamento utilizado. Para detalhes sobre preços, consulte Preços de armazenamento (pagamento conforme o uso).Materialized views ocupam espaço de armazenamento físico. Você é cobrado pelo espaço de armazenamento físico ocupado pelas materialized views. Para obter mais informações sobre preços de armazenamento, consulte Preços de armazenamento (pagamento conforme o uso).
Computação
Custos de computação são aplicados quando você cria, atualiza ou consulta uma materialized view (incluindo operações de reescrita de consulta quando a view é válida).
Projetos por assinatura: Nenhum custo extra de computação é gerado.
Projetos com pagamento conforme o uso: As taxas são calculadas com base na complexidade do SQL e na quantidade de dados de entrada verificados. Para obter detalhes, consulte a seção "Faturamento para trabalhos SQL padrão" em Preços de computação.Preços de computação
Notas adicionais de faturamento para projetos com pagamento conforme o uso:
Atualizações: O SQL usado para atualizar uma materialized view é o mesmo usado para criá-la. Se o projeto estiver vinculado a um grupo de recursos por assinatura, não haverá taxas adicionais. Se estiver vinculado a um grupo de recursos com pagamento conforme o uso, as taxas variarão com base no volume de dados de entrada e na complexidade do SQL. Taxas de armazenamento são aplicadas após cada atualização, com base no espaço utilizado.
Reescrita de consulta (materialized view válida): Os dados de entrada são lidos da materialized view, não da tabela source. Os custos dependem do tamanho da materialized view.
Reescrita de consulta (materialized view inválida): A reescrita de consulta não pode ser realizada. Os dados são lidos da tabela source e os custos dependem do tamanho dessa tabela.
Inchaço de dados: Quando uma materialized view é construída a partir de múltiplas tabelas unidas por JOIN, o resultado armazenado pode ser maior que as tabelas source. O MaxCompute não garante que a leitura de uma materialized view custe menos do que a leitura das tabelas source.
Limitações
As limitações abaixo são vigentes. Algumas podem ser flexibilizadas ou removidas em versões futuras.
Funções não suportadas:
Funções de janela não são suportadas.
Funções com valor de tabela definidas pelo usuário (UDTFs) não são suportadas.
-
Funções não determinísticas — incluindo funções definidas pelo usuário (UDFs) e funções de agregação definidas pelo usuário (UDAFs) — não são suportadas por padrão. Para ativá-las, execute o comando a seguir antes de executar sua consulta:
set odps.sql.materialized.view.support.nondeterministic.function=true;
Notas de uso:
Se a instrução de consulta usada para definir a materialized view falhar na execução, a materialized view não poderá ser criada.
As colunas de chave de partição devem ser derivadas de uma tabela source. A sequência e a contagem de colunas devem corresponder exatamente às da tabela source. Os nomes das colunas podem ser diferentes.
Comentários são obrigatórios para todas as colunas, incluindo as colunas de chave de partição. Especificar comentários apenas para algumas colunas resulta em erro.
É possível especificar atributos de particionamento e clustering para a mesma materialized view. Nesse caso, cada partição terá o atributo de clustering especificado aplicado.
Se a instrução de consulta referenciar operadores não suportados para reescrita de consulta, um erro será retornado durante a criação da materialized view. Para operadores suportados, consulte Reescrita de consulta.
Se uma tabela source contiver uma partição vazia, a atualização da materialized view gerará uma partição vazia correspondente na materialized view.
Sintaxe
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name>
[LIFECYCLE <days>] -- Lifecycle of the materialized view, in days.
[BUILD DEFERRED] -- Create schema only; do not populate data.
[(<col_name> [COMMENT <col_comment>], ...)] -- Column comments.
[DISABLE REWRITE] -- Disable query rewrite for this materialized view.
[COMMENT 'table_comment'] -- Comment for the materialized view.
[PARTITIONED BY (<col_name> [, <col_name>, ...])]
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
INTO <number_of_buckets> BUCKETS]
[REFRESH EVERY <num> MINUTES | HOURS | DAYS]
[TBLPROPERTIES (
"compressionstrategy" = "normal | high | extreme",
"enable_auto_substitute" = "true", -- Fall through to source table when partition is missing.
"enable_auto_refresh" = "true", -- Enable scheduled refresh.
"refresh_interval_minutes" = "120", -- Refresh interval in minutes.
"only_refresh_max_pt" = "true" -- Refresh only the latest partition from the source table.
)]
AS <select_statement>;
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
|
Não |
Ignora a criação se a materialized view já existir. Sem esta cláusula, um erro é retornado caso a view já exista. |
|
|
|
Não |
Projeto do MaxCompute que possui a materialized view. O padrão é o projeto atual. Para encontrar o nome do projeto, faça logon no MaxCompute console, selecione uma região e verifique a página Projects. |
|
|
|
Sim |
Nome da materialized view a ser criada. |
|
|
|
Não |
Ciclo de vida da materialized view. Unidade: dias. Valores válidos: 1–37231. |
|
|
|
Não |
Cria apenas o esquema. Os dados não são populados no momento da criação. |
|
|
|
Não |
Nome da coluna na materialized view. |
|
|
|
Não |
Comentário para a coluna. |
|
|
|
Não |
Desativa a reescrita de consulta para esta materialized view. A reescrita de consulta é ativada por padrão. Para alterar isso após a criação, use |
|
|
|
Não |
Colunas de chave de partição para a materialized view. Obrigatório ao criar uma materialized view particionada. |
|
|
|
RANGE CLUSTERED BY` |
Não |
Atributo de shuffle da materialized view. Obrigatório ao criar uma materialized view com clustering. |
|
|
Não |
Atributo de ordenação dentro de cada bucket. Obrigatório ao criar uma materialized view com clustering. |
|
|
|
Não |
Intervalo de atualização agendada. Unidades: |
|
|
|
Não |
Número de buckets. Obrigatório ao criar uma materialized view com clustering. |
|
|
|
Sim |
Instrução SELECT que define a materialized view. Para detalhes de sintaxe, consulte Sintaxe SELECT. |
Subparâmetros TBLPROPERTIES:
|
Subparâmetro |
Obrigatório |
Valores |
Descrição |
|
|
|
Não |
|
Política de compressão para dados armazenados. |
|
|
|
Não |
|
|
Quando definido como |
|
|
Não |
|
|
Quando definido como |
|
|
Condicional |
Inteiro |
Obrigatório quando |
|
|
|
Não |
|
|
Válido para materialized views particionadas. Quando definido como |
Exemplos
Criar uma materialized view
Os exemplos a seguir utilizam duas tabelas source particionadas: mf_t e mf_t1.
Etapa 1: Crie as tabelas source e insira dados.
CREATE TABLE IF NOT EXISTS mf_t(
id bigint,
value bigint,
name string)
PARTITIONED BY (ds STRING);
ALTER TABLE mf_t ADD PARTITION (ds='1');
INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'), (2,20,'xia');
SELECT * FROM mf_t WHERE ds='1';
-- Result:
-- +------------+------------+------------+------------+
-- | id | value | name | ds |
-- +------------+------------+------------+------------+
-- | 1 | 10 | kyle | 1 |
-- | 2 | 20 | xia | 1 |
-- +------------+------------+------------+------------+
CREATE TABLE IF NOT EXISTS mf_t1(
id bigint,
value bigint,
name string)
PARTITIONED BY (ds STRING);
ALTER TABLE mf_t1 ADD PARTITION (ds='1');
INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'), (3,20,'john');
SELECT * FROM mf_t1 WHERE ds='1';
-- Result:
-- +------------+------------+------------+------------+
-- | id | value | name | ds |
-- +------------+------------+------------+------------+
-- | 1 | 10 | kyle | 1 |
-- | 3 | 20 | john | 1 |
-- +------------+------------+------------+------------+
Etapa 2: Crie uma materialized view. Os exemplos a seguir mostram três configurações comuns.
Exemplo 1: Materialized view particionada
Cria uma materialized view com uma coluna de chave de partição ds, ciclo de vida de 7 dias e comentários nas colunas.
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7
(
key COMMENT 'unique id',
value COMMENT 'input value',
ds COMMENT 'partition'
)
PARTITIONED BY (ds)
AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds
FROM mf_t AS t1 JOIN mf_t1 AS t2
ON t1.id = t2.id AND t1.ds = t2.ds AND t1.ds = '1';
-- Query the materialized view:
SELECT * FROM mf_mv WHERE ds=1;
-- Result:
-- +------------+------------+------------+
-- | key | value | ds |
-- +------------+------------+------------+
-- | 1 | 10 | 1 |
-- +------------+------------+------------+
Exemplo 2: Materialized view não particionada com clustering
CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7
CLUSTERED BY (key) SORTED BY (value) INTO 1024 BUCKETS
AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds
FROM mf_t AS t1 JOIN mf_t1 AS t2
ON t1.id = t2.id AND t1.ds = t2.ds AND t1.ds = '1';
Exemplo 3: Materialized view particionada e com clustering
Combina particionamento e clustering. Os dados dentro de cada partição são distribuídos em buckets.
CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7
PARTITIONED BY (ds)
CLUSTERED BY (key) SORTED BY (value) INTO 1024 BUCKETS
AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds
FROM mf_t AS t1 JOIN mf_t1 AS t2
ON t1.id = t2.id AND t1.ds = t2.ds AND t1.ds = '1';
Usar reescrita de consulta para acelerar consultas
Este exemplo usa uma tabela de acesso a páginas visit_records que registra page_id, user_id e visit_time. Consultas de análise de tráfego que contam visitas por página são executadas frequentemente.
Etapa 1: Crie uma materialized view que pré-compute as contagens de visitas por página.
CREATE MATERIALIZED VIEW count_mv
AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
Etapa 2: Ative a reescrita de consulta e execute a consulta original.
SET odps.sql.materialized.view.enable.auto.rewriting=true;
SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
O MaxCompute corresponde automaticamente a consulta à count_mv e lê os resultados agregados dela, em vez de verificar visit_records.
Etapa 3: Verifique se a consulta foi reescrita usando EXPLAIN.
EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
Saída esperada:
job0 is root job
In Job job0:
root Tasks: M1
In Task M1:
Data source: doc_test_dev.count_mv
TS: doc_test_dev.count_mv
FS: output: Screen
schema:
page_id (string)
_c1 (bigint)
OK
O campo Data source confirma que a consulta lê dados de count_mv no projeto doc_test_dev, e não da tabela original visit_records.
Configurar estratégias de atualização
Os três exemplos abaixo demonstram diferentes maneiras de manter uma materialized view atualizada.
Apenas atualização manual (padrão)
Nenhuma cláusula de atualização é especificada. Atualize a view explicitamente usando ALTER MATERIALIZED VIEW.
CREATE MATERIALIZED VIEW sales_mv
AS SELECT region, sum(amount) AS total FROM sales GROUP BY region;
Atualização agendada usando REFRESH EVERY
Atualiza a view automaticamente a cada 2 horas.
CREATE MATERIALIZED VIEW sales_mv
REFRESH EVERY 2 HOURS
AS SELECT region, sum(amount) AS total FROM sales GROUP BY region;
Atualização agendada usando TBLPROPERTIES
Define um intervalo de atualização de 120 minutos e atualiza automaticamente apenas a partição mais recente da tabela source.
CREATE MATERIALIZED VIEW sales_mv LIFECYCLE 7
PARTITIONED BY (ds)
TBLPROPERTIES (
"enable_auto_refresh" = "true",
"refresh_interval_minutes" = "120",
"only_refresh_max_pt" = "true"
)
AS SELECT region, ds, sum(amount) AS total FROM sales GROUP BY region, ds;
Reescrita de consulta
A reescrita de consulta redireciona automaticamente as consultas para uma materialized view correspondente, eliminando computação redundante nas tabelas source. Para ativar a reescrita de consulta, adicione o seguinte comando antes da sua consulta:
SET odps.sql.materialized.view.enable.auto.rewriting=true;
Se a materialized view for inválida, a reescrita de consulta não poderá ser realizada e o MaxCompute voltará a consultar a tabela source.
Por padrão, um projeto só pode usar suas próprias materialized views para reescrita de consulta. Para permitir a reescrita de consulta usando materialized views de outros projetos, adicione o seguinte comando e especifique os projetos permitidos:
SET odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>;
Operadores suportados para reescrita de consulta
|
Tipo de operador |
Classificação |
MaxCompute |
BigQuery |
Amazon Redshift |
Hive |
|
FILTER |
Correspondência total de expressão |
Suportado |
Suportado |
Suportado |
Suportado |
|
FILTER |
Correspondência parcial de expressão |
Suportado |
Suportado |
Suportado |
Suportado |
|
AGGREGATE |
Agregação única |
Suportado |
Suportado |
Suportado |
Suportado |
|
AGGREGATE |
Múltiplas agregações |
Não suportado |
Não suportado |
Não suportado |
Não suportado |
|
JOIN |
Tipo de JOIN |
INNER JOIN |
Não suportado |
INNER JOIN |
INNER JOIN |
|
JOIN |
JOIN único |
Suportado |
Não suportado |
Suportado |
Suportado |
|
JOIN |
Múltiplos JOINs |
Suportado |
Não suportado |
Suportado |
Suportado |
|
AGGREGATE + JOIN |
— |
Suportado |
Não suportado |
Suportado |
Suportado |
Para que a reescrita de consulta tenha êxito, todas as colunas necessárias pela consulta — colunas de saída, colunas de filtro, colunas de função de agregação e colunas de JOIN — devem estar presentes na materialized view.
Reescrever consultas com condições de filtro
Todos os exemplos nesta seção usam a seguinte materialized view:
CREATE MATERIALIZED VIEW mv AS SELECT a, b, c FROM src WHERE a > 5;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Falha na reescrita — |
|
|
Falha na reescrita — |
|
|
Falha na reescrita — |
Reescrever consultas com funções de agregação
Quando as chaves de agregação correspondem à materialized view, a reescrita é suportada para todas as funções de agregação. Quando as chaves de agregação diferem, apenas SUM, MIN e MAX são suportadas.
Todos os exemplos usam:
CREATE MATERIALIZED VIEW mv AS
SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
|
|
|
|
|
|
Falha na reescrita — |
|
|
Falha na reescrita — re-agregação de |
Quando DISTINCT é usado, a reescrita é suportada apenas quando as chaves de agregação correspondem exatamente à materialized view.
Todos os exemplos usam:
CREATE MATERIALIZED VIEW mv AS
SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
Falha na reescrita — re-agregação de |
|
|
Falha na reescrita — agregação adicional em |
Reescrever consultas com JOIN
Reescrever entradas de JOIN
Quando as entradas de JOIN de uma consulta correspondem à definição de uma materialized view, o MaxCompute substitui essas entradas pela materialized view.
Crie materialized views:
CREATE MATERIALIZED VIEW mv1 AS SELECT a, b FROM j1 WHERE b > 10;
CREATE MATERIALIZED VIEW mv2 AS SELECT a, b FROM j2 WHERE b > 10;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
|
JOIN com condições de filtro
Crie materialized views:
-- Non-partitioned
CREATE MATERIALIZED VIEW mv1 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a = j2.a;
CREATE MATERIALIZED VIEW mv2 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a = j2.a WHERE j1.a > 10;
-- Partitioned
CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds)
AS SELECT t1.id, t1.ds AS ds FROM t1 JOIN t2 ON t1.id = t2.id;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Falha na reescrita — |
JOIN com tabelas adicionais
Crie a materialized view:
CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a = j2.a;
|
Consulta original |
Consulta reescrita |
|
|
|
|
|
|
Os três tipos de reescrita de JOIN podem ser combinados. Se uma consulta atender às condições para múltiplas regras de reescrita, o MaxCompute selecionará o plano de execução mais eficiente. Se o plano reescrito não superar o original, a reescrita não será aplicada.
Reescrever consultas com LEFT JOIN
Crie a materialized view:
CREATE MATERIALIZED VIEW mv LIFECYCLE 7 (
user_id,
job,
total_amount
)
AS SELECT t1.user_id, t1.job, sum(t2.order_amount) AS total_amount
FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id = t2.user_id
GROUP BY t1.user_id;
|
Consulta original |
Consulta reescrita |
|
|
|
Reescrever consultas com UNION ALL
Crie a materialized view:
CREATE MATERIALIZED VIEW mv LIFECYCLE 7 (
user_id,
tran_amount,
tran_date
)
AS SELECT user_id, tran_amount, tran_date FROM alipay_tran
UNION ALL
SELECT user_id, tran_amount, tran_date FROM unionpay_tran;
|
Consulta original |
Consulta reescrita |
|
|
|
Consulta de penetração
Quando uma materialized view particionada não contém todas as partições de sua tabela source — por exemplo, quando apenas a partição mais recente é atualizada — as consultas por partições ausentes consultam a tabela source automaticamente. Isso é chamado de consulta de penetração.

Para ativar consultas de penetração, defina "enable_auto_substitute"="true" em TBLPROPERTIES ao criar a materialized view.
O exemplo a seguir demonstra como funcionam as consultas de penetração.
Etapa 1: Crie uma materialized view particionada com consulta de penetração ativada.
-- Create source table.
CREATE TABLE src (id bigint, name string) PARTITIONED BY (dt string);
-- Insert data into two partitions.
INSERT INTO src PARTITION(dt='20210101') VALUES (1, 'Alex');
INSERT INTO src PARTITION(dt='20210102') VALUES (2, 'Flink');
-- Create a partitioned materialized view with penetration query enabled.
CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7
PARTITIONED BY (dt)
TBLPROPERTIES ("enable_auto_substitute" = "true")
AS SELECT id, name, dt FROM src;
Etapa 2: Consulte a partição 20210101. Esta partição existe em mv, portanto os dados são lidos da materialized view.
SELECT * FROM mv WHERE dt = '20210101';
Etapa 3: Consulte a partição 20210102. Esta partição não existe em mv, então uma consulta de penetração recupera os dados de src.
SELECT * FROM mv WHERE dt = '20210102';
-- Equivalent to:
SELECT * FROM (SELECT id, name, dt FROM src WHERE dt = '20210102') t;
Etapa 4: Consulte um intervalo de partições abrangendo dados disponíveis e ausentes. O MaxCompute realiza uma consulta de penetração para as partições ausentes e combina os resultados usando UNION ALL.
SELECT * FROM mv WHERE dt >= '20201230' AND dt <= '20210102' AND id = '5';
-- Equivalent to:
SELECT * FROM (
SELECT id, name, dt FROM src WHERE dt = '20211231' OR dt = '20210102'
UNION ALL
SELECT * FROM mv WHERE dt = '20210101'
) t WHERE id = '5';
Próximos passos
ALTER MATERIALIZED VIEW: Atualize uma materialized view, altere seu ciclo de vida, ative ou desative o recurso de ciclo de vida ou remova partições.
DESC TABLE/VIEW: Visualize informações detalhadas sobre uma materialized view.
SELECT MATERIALIZED VIEW: Verifique o status de uma materialized view.
DROP MATERIALIZED VIEW: Remova uma materialized view.