O MaxCompute permite reescrever consultas SQL originais para usar uma visualização materializada quando as consultas contêm condições de filtro ou determinados tipos de operadores.
Notas de uso
O princípio fundamental da reescrita de consultas em visualizações materializadas é que a visualização materializada deve conter todos os dados exigidos pela consulta. Isso inclui as colunas de saída e quaisquer colunas usadas em condições de filtro, funções de agregação ou condições de JOIN. O MaxCompute não reescreve a consulta se ela exigir colunas ausentes na visualização materializada ou se usar uma função de agregação não suportada.
-
Para ativar a reescrita de consultas em visualizações materializadas, adicione a seguinte configuração antes da sua instrução de consulta:
SET odps.sql.materialized.view.enable.auto.rewriting=true;A reescrita de consultas não é suportada quando a visualização materializada está em um estado inválido. Nesse caso, o sistema executa a consulta diretamente na tabela de origem, sem aceleração.
-
Reescrita entre projetos
Por padrão, um projeto do MaxCompute só pode usar suas próprias visualizações materializadas para a reescrita de consultas. Para usar visualizações materializadas de outros projetos, especifique uma lista de projetos do MaxCompute permitidos adicionando a seguinte configuração antes da sua consulta:
SET odps.sql.materialized.view.source.project.white.list = <project_name1>,<project_name2>,<project_name3>; -
Para ativar reescritas que usam visualizações materializadas definidas com
LEFT/RIGHT JOINouUNION ALL, adicione a seguinte configuração antes da sua instrução de consulta:SET odps.sql.materialized.view.enable.substitute.rewriting=true;
Tipos de operadores suportados
A tabela a seguir compara os tipos de operadores de reescrita de consultas suportados pelo MaxCompute com os de outros produtos.
Tipo de operador | Classificação | MaxCompute | BigQuery | Amazon Redshift | Hive |
FILTER | Correspondência total de expressão | Suportado | Suportado | Suportado | Suportado |
Correspondência parcial de expressão | Suportado | Suportado | Suportado | Suportado | |
AGGREGATE | AGGREGATE único | Suportado | Suportado | Suportado | Suportado |
Múltiplos AGGREGATEs | 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 único | Suportado | Não suportado | Suportado | Suportado | |
Múltiplos JOINs | Suportado | Não suportado | Suportado | Suportado | |
AGGREGATE+JOIN | - | Suportado | Não suportado | Suportado | Suportado |
Exemplos
Exemplo 1: Reescrita com condições de filtro
-
Crie uma visualização materializada.
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5; -
A tabela a seguir apresenta exemplos de reescrita para a visualização materializada.
Consulta original
Consulta reescrita
SELECT a,b FROM src WHERE a>5;SELECT a,b FROM mv;SELECT a, b FROM src WHERE a=10;SELECT a,b FROM mv WHERE a=10;SELECT a, b FROM src WHERE a=10 AND b='3';SELECT a,b FROM mv WHERE a=10 AND b=3;SELECT a, b FROM src WHERE a>3;(SELECT a,b FROM src WHERE a>3 AND a<=5) UNION (SELECT a,b FROM mv);SELECT a, b FROM src WHERE a=10 AND d=4;A reescrita falha porque a visualização materializada não contém a coluna
d.SELECT d, e FROM src WHERE a=10;A reescrita falha porque a visualização materializada não contém as colunas
dee.SELECT a, b FROM src WHERE a=1;A reescrita falha porque a visualização materializada não contém dados onde
a=1.
Exemplo 2: Reescrita com funções de agregação
Todas as funções de agregação podem ser reescritas se a visualização materializada e a consulta compartilharem a mesma chave de agregação. Se as chaves de agregação forem diferentes, apenas as reescritas que usam SUM, MIN e MAX são suportadas.
-
Crie uma visualização materializada.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b; -
A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.
Consulta original
Consulta reescrita
SELECT a, sum(c) FROM src GROUP BY a;SELECT a, sum(sum) FROM mv GROUP BY a;SELECT a, count(d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(b) FROM (SELECT a, b FROM src GROUP BY a, b) GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;SELECT a,count(b) FROM mv GROUP BY a;A reescrita falha porque a visualização já agregou as colunas
aeb, impedindo uma nova agregação da colunab.SELECT a, count(c) FROM src GROUP BY a;A reescrita falha porque o sistema não suporta a reagregação da função
COUNT.
Se uma função de agregação contiver DISTINCT, o MaxCompute só reescreve a consulta se a visualização materializada e a consulta original tiverem a mesma chave de agregação. Caso contrário, a reescrita não será possível.
-
Crie uma visualização materializada.
CREATE MATERIALIZED VIEW mv AS SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b; -
A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.
Consulta original
Consulta reescrita
SELECT a, count(DISTINCT d) FROM src GROUP BY a, b;SELECT a, cnt FROM mv;SELECT a, count(c) FROM src GROUP BY a, b;A reescrita falha porque o sistema não suporta a reagregação da função
COUNT.SELECT a, count(DISTINCT c) FROM src GROUP BY a;A reescrita falha porque a coluna
aexige outra agregação.
Exemplo 3: Reescrita com uma cláusula JOIN
Reescrita de entradas de JOIN
-
Crie visualizações materializadas.
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; -
A tabela a seguir mostra como as consultas são reescritas com base nas visualizações materializadas.
Consulta original
Consulta reescrita
SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN j2 ON j1.a=j2.a;SELECT mv1.a, mv1.b, j2.a FROM mv1 JOIN j2 ON mv1.a=j2.a;SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN (SELECT a,b FROM j2 WHERE b > 10) j2 ON j1.a=j2.a;SELECT mv1.a,mv1.b,mv2.a FROM mv1 JOIN mv2 ON mv1.a=mv2.a;
JOIN com condições de filtro
-
Crie visualizações materializadas.
--Create a non-partitioned materialized view. 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; --Create a partitioned materialized view. 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; -
A tabela a seguir mostra como as consultas são reescritas com base nas visualizações materializadas.
Consulta original
Consulta reescrita
SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a=4;SELECT a, b FROM mv1 WHERE a=4;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 20;SELECT a,b FROM mv2 WHERE a>20;SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5;(SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5 AND j1.a <= 10) UNION SELECT * FROM mv2;SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds='20210306';SELECT key FROM mv WHERE ds='20210306';SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds>='20210306';SELECT key FROM mv WHERE ds>='20210306';SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j2.a=4;A reescrita falha porque a visualização materializada não contém a coluna
j2.a.
Extensão de um JOIN
-
Crie uma visualização materializada.
CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a; -
A tabela a seguir mostra como as consultas são reescritas com base na visualização materializada.
Consulta original
Consulta reescrita
SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j1.a=j3.a;SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j2.a=j3.a;SELECT mv.a,mv.b FROM mv JOIN j3 ON mv.a=j3.a;
É possível combinar esses três cenários de reescrita de JOIN.
Como o objetivo da reescrita de consultas em visualizações materializadas é acelerar as consultas, o MaxCompute prioriza as regras de reescrita que oferecem o melhor desempenho. O sistema não aplica uma regra se ela introduzir operações que resultem em baixa aceleração.
Exemplo 4: Reescrita com uma cláusula LEFT JOIN
-
Crie uma visualização materializada.
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, t1.job; -
A tabela a seguir mostra como uma consulta é reescrita com base na visualização materializada.
Consulta original
Consulta reescrita
SELECT t1.user_id, 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;SELECT user_id, total_amount FROM mv;
Exemplo 5: Reescrita com uma cláusula UNION ALL
-
Crie uma visualização materializada.
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; -
A tabela a seguir mostra como uma consulta é reescrita com base na visualização materializada.
Consulta original
Consulta reescrita
SELECT user_id, tran_amount FROM alipay_tran UNION ALL SELECT user_id, tran_amount FROM unionpay_tran;SELECT user_id, tran_amount FROM mv;
Exemplo 6: Caso de uso
-
Cenário
Considere uma tabela de visitas de página chamada
visit_recordsque registra o ID da página, o ID do usuário e o horário da visita para cada acesso. Uma tarefa de análise frequente é contar o número de visitas para diferentes páginas.Nessa situação, crie uma visualização materializada em
visit_recordsque agrupe por ID da página e conte as visitas de cada página. Em seguida, execute consultas subsequentes nessa visualização materializada.A estrutura de
visit_recordsé a seguinte:+------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | page_id | string | | | | user_id | string | | | | visit_time | string | | | +------------------------------------------------------------------------------------+ -
Crie uma visualização materializada.
-- Create a materialized view for the visit_records table that groups by page ID and counts the visits for each page. CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id; -
Execute a seguinte consulta:
SET odps.sql.materialized.view.enable.auto.rewriting=true; SELECT page_id, count(*) FROM visit_records GROUP BY page_id;Quando essa instrução de consulta é executada, o MaxCompute corresponde automaticamente à visualização materializada
count_mve lê os dados pré-agregados decount_mv. -
Para verificar se a consulta foi reescrita usando a visualização materializada, execute o seguinte comando
EXPLAIN:EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;O sistema retorna o seguinte resultado:
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) OKO
Data sourceno resultado retornado mostra que a tabela lida pela consulta é acount_mvdo projetodoc_test_dev. Isso indica que a visualização materializada está ativa e a reescrita da consulta foi bem-sucedida.
Documentos relacionados
Para mais informações sobre as operações de visualizações materializadas, consulte Materialized view operations.
Para mais informações sobre o recurso de atualização agendada para visualizações materializadas, consulte Scheduled updates for materialized views.