Este tópico descreve a instrução CREATE MATERIALIZED VIEW. Use esta instrução para criar uma materialized view com política de atualização completa ou rápida e definir seu cronograma de atualização.
Sintaxe
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[COMMENT 'view_comment']
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
AS
query_body
mv_definition:
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
| table_constraints}
[, ... ])
[table_attribute]
[partition_options]
[index_all]
[storage_policy]
[block_size]
[engine]
[table_properties]
Parâmetros
OR REPLACE |
Opcional |
Alterável após a criação: Não |
|
Clusters com versão de kernel 3.1.4.7 ou posterior suportam este parâmetro.
|
|||
mv_definition |
Opcional |
Alterável após a criação: Não |
|
|
Define o esquema da materialized view. Ao omitir esta cláusula, o sistema infere o esquema a partir do query_body. Por padrão, o sistema define uma chave primária, cria índices em todas as colunas, configura a política de armazenamento como hot storage e utiliza o mecanismo XUANWU. Para definir manualmente o esquema de uma materialized view, incluindo chave de distribuição, chave de partição, chave primária, índices e política de armazenamento de dados quentes/frios, use a mesma sintaxe da instrução CREATE TABLE. Por exemplo, caso não deseje indexar todas as colunas, use a palavra-chave INDEX para especificar quais colunas indexar. Para reduzir custos de armazenamento, também é possível definir uma política mista de armazenamento quente/frio ou até mesmo reter apenas os dados do último ano. Regras de chave primária
RecomendaçõesPara obter o melhor desempenho de consulta, recomenda-se definir uma chave primária, chave de distribuição e chave de partição ao criar uma materialized view. |
|||
mv_properties |
Opcional |
Alterável após a criação: Sim (usando ALTER MATERIALIZED VIEW) |
|
Clusters das edições Enterprise, Basic e Data Lakehouse com versão de kernel 3.1.9.3 ou posterior suportam este parâmetro. Define a política de recursos para a materialized view. Isso inclui
mv_resource_groupEspecifica o grupo de recursos usado para criar e atualizar a materialized view. Se não for especificado, o sistema utiliza o grupo de recursos padrão O valor deste parâmetro pode ser um grupo de recursos Interactive ou Job do mecanismo XIHE. A diferença é que os grupos de recursos Job provisionam recursos sob demanda, o que geralmente introduz uma latência de segundos ou minutos. Caso tenha alta tolerância à latência de atualização, especifique um grupo de recursos Job. Uma materialized view que utiliza um grupo de recursos Job também é conhecida como materialized view elástica. Para aumentar a velocidade de atualização de uma materialized view elástica, configure o parâmetro elastic_job_max_acu em Visualize os grupos de recursos disponíveis para seu cluster na página Resource Groups no console ou chamando a operação DescribeDBResourceGroup. A operação falhará se o grupo de recursos especificado não existir. mv_refresh_hintsEspecifica parâmetros de configuração para a materialized view. Para obter uma lista dos parâmetros suportados e seus usos, consulte Common hints. |
|||
REFRESH [COMPLETE | FAST] |
Opcional |
Valor padrão: COMPLETE |
Alterável após a criação: Não |
|
Define a política de atualização da materialized view. Para informações sobre as diferenças entre as políticas de atualização e seus casos de uso, consulte Select a refresh policy. COMPLETEUma atualização completa executa o SQL da consulta original para verificar os dados de todas as partições alvo na tabela base e substitui totalmente os dados antigos pelos novos dados calculados. A atualização completa suporta os mecanismos de gatilho de atualização FASTAs versões 3.1.9.0 e posteriores suportam este parâmetro. A versão 3.1.9.0 suporta atualização rápida apenas para materialized views de tabela única. A versão 3.2.0.0 e posteriores suportam atualização rápida tanto para materialized views de tabela única quanto de múltiplas tabelas. Executa uma atualização rápida. O sistema reescreve a consulta da view ( Antes de criar uma materialized view que usa atualização rápida, ative o recurso de binary logging tanto para o cluster quanto para as tabelas base. Caso contrário, a criação falhará. Para instruções, consulte Enable the binary logging feature. Para uma materialized view que utiliza atualização rápida, o mecanismo de gatilho de atualização deve ser uma atualização automática agendada. Defina o horário da próxima atualização usando A atualização rápida possui algumas limitações. Se o |
|||
ON [DEMAND | OVERWRITE] |
Opcional |
Valor padrão: DEMAND |
Alterável após a criação: Não |
|
Define o mecanismo de gatilho de atualização da materialized view. Para informações sobre as diferenças entre os mecanismos de gatilho de atualização e seus casos de uso, consulte Select a refresh trigger mechanism. DEMANDAtualização sob demanda. Isso significa que você pode atualizar manualmente a materialized view quando necessário ou usar Materialized views com atualização rápida suportam apenas OVERWRITEA materialized view é atualizada automaticamente após os dados em sua tabela base serem sobrescritos por uma instrução Quando o mecanismo de gatilho de atualização é |
|||
[START WITH date] [NEXT date] |
Opcional |
Alterável após a criação: Não |
|
|
Quando o mecanismo de gatilho de atualização de uma materialized view é START WITHHorário da primeira atualização. Se omitido, a view será atualizada imediatamente após a criação. NEXTHorário da próxima atualização agendada.
dateFunções de tempo são suportadas. O tempo tem precisão de segundos e os milissegundos são truncados. |
|||
[DISABLE | ENABLE] QUERY REWRITE |
Opcional |
Valor padrão: DISABLE |
Alterável após a criação: Sim (usando ALTER MATERIALIZED VIEW) |
As versões 3.1.4 e posteriores suportam este parâmetro. Ativa ou desativa a reescrita automática de consultas para esta materialized view. Para mais informações, consulte Query rewrite for materialized views. DISABLEDesativa o recurso de reescrita de consultas para a materialized view atual. ENABLEAtiva o recurso de reescrita de consultas para a materialized view atual. Após ativar este recurso, o otimizador pode reescrever total ou parcialmente uma consulta com base em seu padrão SQL e roteá-la para a materialized view. Isso evita a execução dos cálculos originais na tabela base e melhora o desempenho da consulta. |
|||
query_body |
Obrigatório |
Alterável após a criação: Não |
|
|
Define a consulta nas tabelas base para a materialized view. Regras de colunas SELECTAs colunas na lista SELECT devem seguir estas regras:
Outras limitações |
|||
Permissões necessárias
Exemplos
Pré-requisitos
Os exemplos neste tópico utilizam as tabelas base criadas nesta seção. Para executar os exemplos, primeiro crie as tabelas base usando as seguintes instruções SQL.
/+ 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 );
Materialized view com atualização completa
-
Crie a materialized view
myview1, que é atualizada a cada 5 minutos.CREATE MATERIALIZED VIEW myview1 REFRESH -- Equivalent to REFRESH COMPLETE NEXT now() + INTERVAL 5 minute AS SELECT count(*) as cnt FROM customer; -
Crie a materialized view
myview2, que é atualizada às 02:00 todos os dias.CREATE MATERIALIZED VIEW myview2 REFRESH COMPLETE 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 count(*) as cnt FROM customer; -
Crie uma materialized view
myview3que é atualizada toda segunda-feira às 02:00.CREATE MATERIALIZED VIEW myview3 REFRESH COMPLETE ON DEMAND START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer; -
Crie a materialized view
myview4, que é atualizada às 02:00 no primeiro dia de cada mês.CREATE MATERIALIZED VIEW myview4 REFRESH -- Equivalent to REFRESH COMPLETE NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer; -
Crie a materialized view
myview5e atualize-a apenas uma vez.CREATE MATERIALIZED VIEW myview5 REFRESH -- Equivalent to REFRESH COMPLETE START WITH now() + INTERVAL 1 day AS SELECT count(*) as cnt FROM customer; -
Crie a materialized view
myview6que não é atualizada automaticamente e depende inteiramente de atualizações manuais.CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (customer_id) ) DISTRIBUTED BY HASH (customer_id) AS SELECT customer_id FROM customer;Atualize manualmente a materialized view:
REFRESH MATERIALIZED VIEW myview6; -
Crie a materialized view
myview7. Não é necessário definir manualmente um horário de atualização, pois a materialized view é atualizada automaticamente após a tabela base ser sobrescrita por uma operaçãoINSERT OVERWRITE.CREATE MATERIALIZED VIEW myview7 REFRESH COMPLETE ON OVERWRITE AS SELECT count(*) as cnt FROM customer;
Materialized view de tabela única com atualização rápida
Antes de criar uma materialized view que usa atualização rápida, ative o recurso de binary logging para o cluster e as tabelas base.
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
-
Crie uma materialized view de tabela única
fast_mv1que usa atualização rápida sem operação de agregação e é atualizada 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 materialized view de tabela única
fast_mv2que usa atualização rápida com agregação GROUP BY e é atualizada 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 materialized view de tabela única
fast_mv3que usa atualização rápida sem agregação GROUP BY e é atualizada 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;
Materialized view de múltiplas tabelas com atualização rápida
-
Crie uma materialized view de múltiplas tabelas chamada
fast_mv4com atualização rápida e sem agregação. Ela é atualizada a cada 5 segundos.CREATE MATERIALIZED VIEW fast_mv4 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT c.customer_id, c.customer_name, s.sale_id, (s.price * s.quantity) AS revenue FROM sales s JOIN customer c ON s.customer_id = c.customer_id; -
Crie uma materialized view de múltiplas tabelas chamada
fast_mv5com atualização rápida e agregação agrupada. Ela é atualizada a cada 10 segundos.CREATE MATERIALIZED VIEW fast_mv5 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT s.sale_id, c.customer_name, COUNT(*) AS cnt, SUM(s.price * s.quantity) AS revenue FROM sales s JOIN (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id GROUP BY s.sale_id, c.customer_name;
Materialized view particionada
Crie a materialized view myview8 e defina a chave de distribuição e a chave de partição.
CREATE MATERIALIZED VIEW myview8 (
quantity INT, -- The materialized view includes all columns from the query results even if they are not explicitly listed in the definition.
price DECIMAL(10, 2),
sale_date TIMESTAMP
)
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
AS
SELECT * FROM sales;
Definir chaves e índices
-
Crie a materialized view
myview9, criando um índice apenas na coluna especificadacustomer_nameem vez de em todas as colunas.CREATE MATERIALIZED VIEW myview9 ( INDEX (sale_date), PRIMARY KEY (sale_id) ) DISTRIBUTED BY HASH (sale_id) REFRESH NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales; -
Crie uma materialized view chamada
myview10com chave primária, chave de distribuição, índice de clustering, índices em colunas especificadas e um comentário.CREATE MATERIALIZED VIEW myview10 ( quantity INT, -- The materialized view includes all columns from the query results even if they are not explicitly listed in the definition. price DECIMAL(10, 2), KEY INDEX_ID(customer_id) COMMENT 'customer', CLUSTERED KEY INDEX(sale_id), PRIMARY KEY(sale_id,sale_date) ) DISTRIBUTED BY HASH(sale_id) COMMENT 'MATERIALIZED VIEW c' AS SELECT * FROM sales;
Materialized view elástica
-
Crie a materialized view elástica
myview11, usando o grupo de recursos do tipo Jobserverlesspara criá-la e atualizá-la, com frequência de atualização de uma vez por dia.CREATE MATERIALIZED VIEW myview11 MV_PROPERTIES='{ "mv_resource_group":"serverless" }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales; -
Crie a materialized view elástica
myview12, que usa o grupo de recursos do tipo Jobserverlesspara criação e atualizações, podendo utilizar 12 ACU de recursos deste grupo.CREATE MATERIALIZED VIEW myview12 MV_PROPERTIES='{ "mv_resource_group":"serverless", "mv_refresh_hints":{"elastic_job_max_acu":"12"} }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;
Tópicos relacionados
Materialized views: Conheça os casos de uso e as atualizações de recursos das materialized views.
Create a materialized view: Aprenda a criar uma materialized view e encontre soluções para erros comuns.
Refresh a materialized view: Saiba como realizar uma atualização completa ou rápida em uma materialized view.
Manage materialized views: Aprenda a visualizar a definição de uma materialized view, listar todas as materialized views e excluir uma materialized view.