Crie uma Dynamic Table que atualiza automaticamente os resultados de consultas das tabelas base usando atualização incremental ou completa.
Observações importantes
Limitações de uso da Dynamic Table: Suporte e limitações da Dynamic Table.
O Hologres V3.1 e versões posteriores exigem a nova sintaxe para criar Dynamic Tables. Ainda é possível executar operações ALTER em tabelas criadas com a sintaxe da V3.0, mas não é possível criar novas tabelas dessa forma. Para tabelas não particionadas, use o comando de conversão de sintaxe para converter a sintaxe legada para a nova. Recrie manualmente as tabelas particionadas.
A atualização para o Hologres V3.1 ou superior exige a recriação das Incremental Dynamic Tables existentes. Use o comando de conversão de sintaxe para isso.
No Hologres V3.1+, o mecanismo otimiza o processo de atualização de forma adaptativa. IDs de consulta negativos podem aparecer durante as operações de atualização.
Sintaxe
V3.1+ (nova sintaxe)
A versão V3.1+ suporta apenas a nova sintaxe.
Sintaxe de criação da Dynamic Table
Sintaxe para criar uma Dynamic Table na versão V3.1+:
CREATE DYNAMIC TABLE [ IF NOT EXISTS ] [<schema_name>.]<table_name>
[ (<col_name> [, ...] ) ]
[LOGICAL PARTITION BY LIST(<partition_key>)]
WITH (
-- Dynamic Table properties
freshness = '<num> {minutes | hours}', -- Required
[auto_refresh_enable = {true | false},] -- Optional
[auto_refresh_mode = {'full' | 'incremental' | 'auto'},] -- Optional
[base_table_cdc_format = {'stream' | 'binlog'},] -- Optional
[auto_refresh_partition_active_time = '<num> {minutes | hours | days}',] -- Optional
[partition_key_time_format = {'YYYYMMDDHH24' | 'YYYY-MM-DD-HH24' | 'YYYY-MM-DD_HH24' | 'YYYYMMDD' | 'YYYY-MM-DD' | 'YYYYMM' | 'YYYY-MM' | 'YYYY'},] --Optional
[computing_resource = {'local' | 'serverless' | '<warehouse_name>'},] -- Optional. The warehouse_name value is supported only in Hologres V4.0.7 and later.
[refresh_guc_hg_experimental_serverless_computing_required_cores=xxx,] --Optional. Specifies the required computing cores for Serverless.
[refresh_guc_<guc_name> = '<guc_value>',] -- Optional
-- General properties
[orientation = {'column' | 'row' | 'row,column'},]
[table_group = '<tableGroupName>',]
[distribution_key = '<columnName>[,...]]',]
[clustering_key = '<columnName>[:asc] [,...]',]
[event_time_column = '<columnName> [,...]',]
[bitmap_columns = '<columnName> [,...]',]
[dictionary_encoding_columns = '<columnName> [,...]',]
[time_to_live_in_seconds = '<non_negative_literal>',]
[storage_mode = {'hot' | 'cold'},]
)
AS
<query>; -- Query definition.
Parâmetros
Modo de atualização e recursos
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Atualidade alvo dos dados em minutos ou horas. Mínimo: 1 minuto. O mecanismo agenda as atualizações com base no horário da última atualização e neste valor de |
Sim |
Nenhum |
|
|
Modo de atualização. Valores válidos:
|
Não |
auto |
|
|
Ativa ou desativa a atualização automática. Valores válidos:
|
Não |
true |
|
|
Define como consumir alterações de dados da tabela base durante a atualização incremental.
Nota
|
Não |
stream |
|
|
Recurso de computação para atualização. Valores válidos:
|
Não |
serverless |
|
|
Define parâmetros GUC para atualização. Para ver os GUCs suportados, consulte GUC parameters. |
Não |
Nenhum |
Tabelas particionadas
Tabela com particionamento lógico
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Cria uma Dynamic Table com particionamento lógico. Requer |
Não |
Nenhum |
|
|
Escopo de atualização para partições, em minutos, horas ou dias. O Hologres rastreia retroativamente a partir do horário atual e atualiza as partições dentro desta janela. As partições ativas são aquelas cujo tempo decorrido desde o início (derivado do nome da partição) é menor que o valor de Nota
|
Sim |
O padrão é Isso fornece um buffer de 1 hora para compensar possíveis atrasos de dados da tabela base. Por exemplo, com particionamento diário, o padrão torna-se 25 horas (1 dia + 1 hora). |
|
|
Formato do nome da partição. Valores válidos:
|
Sim |
Nenhum |
Tabelas com particionamento físico
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Cria uma Dynamic Table com particionamento físico. Dynamic Tables com particionamento físico não possuem particionamento dinâmico e apresentam limitações de uso. Recomenda-se o uso de partições lógicas. Para entender as diferenças, consulte CREATE LOGICAL PARTITION TABLE. Importante
O Hologres V3.1+ não suporta a criação de uma Dynamic Table como tabela com particionamento físico. |
Não |
Nenhum |
Propriedades da tabela
|
Parâmetro |
Descrição |
Obrigatório |
Valor padrão |
|
|
Modo de atualização completa |
Modo de atualização incremental |
|||
|
|
Nomes das colunas. Especifique os nomes, mas não atributos ou tipos de dados — o mecanismo faz a inferência automaticamente. Nota
Especificar atributos e tipos de dados das colunas pode levar a inferências incorretas pelo mecanismo. |
Não |
Nome da coluna da consulta |
Nome da coluna da consulta |
|
|
Formato de armazenamento. |
Não |
|
|
|
|
Table Group. O padrão é o grupo do banco de dados atual. Para mais informações, consulte Manage table groups and shards. |
Não |
Nome do Table Group padrão |
Nome do Table Group padrão |
|
|
Chave de distribuição. Para mais informações, consulte Distribution key. |
Não |
(nenhum) |
(nenhum) |
|
|
Chave de clusterização. Para mais informações, consulte Clustering key. |
Não |
Permitido, com valor padrão inferido. |
Permitido, com valor padrão inferido. |
|
|
Consulte Event time column (segment key). |
Não |
(nenhum) |
(nenhum) |
|
|
Colunas de bitmap. Para mais informações, consulte Bitmap index. |
Não |
Campos do tipo TEXT |
Campos do tipo TEXT |
|
|
Consulte Dictionary encoding. |
Não |
Campos do tipo TEXT |
Campos do tipo TEXT |
|
|
TTL dos dados. |
Não |
Sem expiração |
Sem expiração |
|
|
Camada de armazenamento. Valores válidos:
Nota
Para detalhes, consulte Set up storage tiering. |
Não |
|
|
|
|
Ativa o binlog para a Dynamic Table. Subscribe to Hologres Binlog. Nota
|
Não |
|
|
|
|
TTL do binlog. |
Não |
|
|
Consulta
Consulta que define os dados da Dynamic Table. As consultas e tabelas base suportadas variam conforme o modo de atualização. Para mais informações, consulte Suporte e limitações da Dynamic Table.
V3.0 (sintaxe legada)
Sintaxe de criação da Dynamic Table
CREATE DYNAMIC TABLE [IF NOT EXISTS] <schema.tablename>(
[col_name],
[col_name]
) [PARTITION BY LIST (col_name)]
WITH (
[refresh_mode='[full|incremental]',]
[auto_refresh_enable='[true|false',]
--Incremental refresh parameters:
[incremental_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
[incremental_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',]
[incremental_guc_hg_computing_resource='[ local | serverless]',]
[incremental_guc_hg_experimental_serverless_computing_required_cores='<num>',]
--Full refresh parameters:
[full_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
[full_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',]
[full_guc_hg_computing_resource='[ local | serverless]',]--hg_full_refresh_computing_resource defaults to serverless, can be set at the DB level, and is optional for users.
[full_guc_hg_experimental_serverless_computing_required_cores='<num>',]
--Shared parameters, GUCs are allowed:
[refresh_guc_<guc>='xxx]',]
-- General Dynamic Table properties:
[orientation = '[column]',]
[table_group = '[tableGroupName]',]
[distribution_key = 'columnName[,...]]',]
[clustering_key = '[columnName{:asc]} [,...]]',]
[event_time_column = '[columnName [,...]]',]
[bitmap_columns = '[columnName [,...]]',]
[dictionary_encoding_columns = '[columnName [,...]]',]
[time_to_live_in_seconds = '<non_negative_literal>',]
[storage_mode = '[hot | cold]']
)
AS
<query> --Query definition
Parâmetros
Modo de atualização e recursos
|
Categoria |
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
Parâmetros compartilhados de atualização |
|
Modo de atualização. Valores válidos: Se não for definido, nenhuma atualização será executada. |
Não |
(nenhum) |
|
|
Ativa ou desativa a atualização automática. Valores válidos:
|
Não |
false |
|
|
|
Define parâmetros GUC para atualização. Para obter uma lista de GUCs suportados, consulte GUC parameters. Nota
Por exemplo, para definir o GUC de fuso horário, use |
Não |
(nenhum) |
|
|
Atualização incremental |
|
Horário de início da atualização incremental. Valores válidos:
|
Não |
immediate |
|
|
Intervalo de atualização incremental, em minutos ou horas.
|
Não |
(nenhum) |
|
|
|
Recursos de computação para atualização incremental. Valores válidos:
Nota
Para definir os recursos de computação no nível do banco de dados, execute |
Não |
local |
|
|
|
Núcleos de Serverless Computing para atualização. Nota
As cotas de recursos do Serverless Computing variam conforme as especificações da instância. Para mais informações, consulte Manage serverless computing resources. |
Não |
(nenhum) |
|
|
Atualização completa |
|
Horário de início da atualização completa. Valores válidos:
|
Não |
immediate |
|
|
Intervalo de atualização completa, em minutos ou horas.
|
Não |
(nenhum) |
|
|
|
Recursos de computação para atualização completa. Valores válidos:
Nota
Para definir os recursos de computação no nível do banco de dados, execute |
Não |
local |
|
|
|
Núcleos de Serverless Computing para atualização. Nota
As cotas de recursos do Serverless Computing variam conforme as especificações da instância. Para mais informações, consulte Manage serverless computing resources. |
Não |
(nenhum) |
Propriedades da tabela
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Completa |
Incremental |
|||
|
|
Nomes das colunas. Especifique os nomes, mas não atributos ou tipos de dados — o mecanismo faz a inferência automaticamente. Nota
Especificar atributos e tipos de dados das colunas pode levar a inferências incorretas pelo mecanismo. |
Não |
Nome da coluna da consulta |
Nome da coluna da consulta |
|
|
Formato de armazenamento da Dynamic Table. |
Não |
|
|
|
|
Table Group. O padrão é o grupo do banco de dados atual. Para mais informações, consulte Manage table groups and shards. |
Não |
Nome do Table Group padrão |
Nome do Table Group padrão |
|
|
Chave de distribuição. Para mais informações, consulte Distribution key. |
Não |
(nenhum) |
(nenhum) |
|
|
Chave de clusterização. Para mais informações, consulte Clustering key. |
Não |
Permitido, com valor padrão inferido. |
Permitido, com valor padrão inferido. |
|
|
Chave de segmento. Para mais informações, consulte Event time column (segment key). |
Não |
(nenhum) |
(nenhum) |
|
|
Colunas de bitmap. Para mais informações, consulte Bitmap index. |
Não |
Campos do tipo TEXT |
Campos do tipo TEXT |
|
|
Consulte Dictionary encoding. |
Não |
Campos do tipo TEXT |
Campos do tipo TEXT |
|
|
TTL dos dados. |
Não |
Sem expiração |
Sem expiração |
|
|
Camada de armazenamento. Valores válidos:
Nota
Consulte Set up storage tiering. |
Não |
|
|
|
|
Cria uma Dynamic Table particionada. As partições podem usar modos de atualização diferentes para atender a necessidades variadas de atualidade. |
Não |
Tabela não particionada |
Tabela não particionada |
Consulta
A consulta que gera os dados da Dynamic Table. As consultas e tipos de tabela base suportados variam conforme o modo de atualização. Suporte e limitações da Dynamic Table.
Atualização incremental
A atualização incremental detecta alterações na tabela base e grava apenas o delta na Dynamic Table, sendo ideal para consultas quase em tempo real (nível de minuto).
-
Limitações da tabela base:
A versão V3.1 usa o modo
streampor padrão. Se sua tabela base tinha o binlog ativado na V3.0, desative-o para evitar custos extras de armazenamento.Na V3.0, você deve ativar o binlog para a tabela base, exceto para tabelas de dimensão envolvidas em joins. Ativar o binlog em uma tabela base gera alguma sobrecarga de armazenamento. Verifique o uso de armazenamento do binlog consultando View table storage details.
No modo de atualização incremental, o Hologres gera uma tabela de estado em segundo plano para registrar resultados intermediários de agregação (consulte Dynamic tables para detalhes). Essa tabela de estado também consome espaço para armazenamento de estados. Para visualizar o uso de armazenamento, consulte View dynamic table schema and lineage.
Consultas e operadores suportados para atualização incremental: Suporte e limitações da Dynamic Table.
Ao executar uma atualização incremental pela primeira vez, o sistema realiza uma carga completa dos dados e inicializa a tabela de estado usada para rastreamento. Como todos os dados históricos precisam ser processados de uma vez e as estruturas de estado devem ser inicializadas, o consumo de memória e recursos de computação é significativamente maior do que nos ciclos incrementais subsequentes. Se o volume de dados da tabela base for grande ou os recursos insuficientes, poderá ocorrer um erro de falta de memória (OOM).
Para evitar gargalos de recursos, avalie o volume de dados da sua tabela base antes da primeira execução e utilize recursos de Serverless Computing para executar a primeira atualização. Para mais informações, consulte @xref node="5933653" Use Serverless Computing for data reads and writes @/xref .
Stream-stream joins
Os JOINs stream-stream possuem a mesma semântica das consultas OLAP, utilizando HASH JOIN e suportando INNER JOIN, LEFT/RIGHT/FULL OUTER JOIN.
V3.1
A partir do Hologres V3.1, o GUC para stream-stream JOIN é ativado por padrão.
Exemplo:
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
);
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt WITH (
auto_refresh_mode = 'incremental',
freshness='10 minutes'
)
AS
SELECT order_id, orders.user_id, user_name
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;
-- After refresh, one joined record is visible
REFRESH TABLE dt;
SELECT * FROM dt;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- After refresh, two joined records are visible. Dimension table updates affect all data and can correct previously joined records.
REFRESH TABLE dt;
SELECT * FROM dt;
Resultado:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | dynamic table
4 | 1 | dynamic table
(2 rows)
V3.0
Os JOINs stream-stream são suportados na versão V3.0.26. Para ativar esse recurso, atualize sua instância e habilite o GUC:
-- Enable at session level
SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;
-- Enable at DB level (takes effect for new connections)
ALTER database <db_name> SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;
Exemplo:
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
) WITH (binlog_level = 'replica');
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt WITH (refresh_mode = 'incremental')
AS
SELECT order_id, orders.user_id, user_name
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;
-- After refresh, one joined record is visible
REFRESH TABLE dt;
SELECT * FROM dt;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- After refresh, two joined records are visible. Dimension table updates affect all data and can correct previously joined records.
REFRESH TABLE dt;
SELECT * FROM dt;
Resultado:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | dynamic table
4 | 1 | dynamic table
(2 rows)
Joins com tabela de dimensão
Cada registro do fluxo é unido ao snapshot mais recente da tabela de dimensão no momento do processamento. Alterações na tabela de dimensão após um JOIN não afetam os dados já processados.
O comportamento do JOIN com tabela de dimensão independe do tamanho da tabela; ele é determinado pela instrução JOIN.
V3.1
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt_join_2 WITH (
auto_refresh_mode = 'incremental',
freshness='10 minutes')
AS
SELECT order_id, orders.user_id, user_name
-- FOR SYSTEM_TIME AS OF PROCTIME() identifies 'users' as a dimension table
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;
-- After refresh, one joined record is visible
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- After refresh, two joined records are visible. Dimension table updates only affect new data and cannot correct previously joined data.
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
Resultado:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | hologres
4 | 1 | dynamic table
(2 rows)
V3.0
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt_join_2 WITH (refresh_mode = 'incremental')
AS
SELECT order_id, orders.user_id, user_name
-- FOR SYSTEM_TIME AS OF PROCTIME() identifies 'users' as a dimension table
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;
-- After refresh, one joined record is visible
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- After refresh, two joined records are visible. Dimension table updates only affect new data and cannot correct previously joined data.
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
Resultado:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | hologres
4 | 1 | dynamic table
(2 rows)
Consumo incremental de tabelas lake Paimon
A atualização incremental suporta o consumo de tabelas Paimon para cenários de lakehouse.
As External Dynamic Tables suportam leituras incrementais e write-back, reduzindo o custo de processamento e a latência de consulta. External Dynamic Table introduction.
Consumo híbrido
As Incremental Dynamic Tables suportam um modelo híbrido: uma carga completa inicial de todos os dados existentes da tabela base, seguida por processamento incremental contínuo.
V3.1
A versão V3.1 ativa o modelo de atualização híbrida por padrão. Exemplo:
--Prepare the base table and insert data
CREATE TABLE base_sales(
day TEXT NOT NULL,
hour INT,
user_id BIGINT,
ts TIMESTAMPTZ,
amount FLOAT,
pk text NOT NULL PRIMARY KEY
);
-- Import data into the base table
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');
-- Import more data
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');
-- Create an incremental Dynamic Table
CREATE DYNAMIC TABLE sales_incremental
WITH (
auto_refresh_mode='incremental',
freshness='10 minutes'
)
AS
SELECT day, hour, SUM(amount), COUNT(1)
FROM base_sales
GROUP BY day, hour;
Verifique a consistência dos dados:
-
Consulte a tabela base
SELECT day, hour, SUM(amount), COUNT(1) FROM base_sales GROUP BY day, hour;Resultado:
day hour sum count 2024-08-29 2 100 1 2024-08-29 1 5 1 -
Consulte a Dynamic Table
SELECT * FROM sales_incremental;Resultado:
day hour sum count 2024-08-29 1 5 1 2024-08-29 2 100 1
V3.0
Na V3.0, para usar o consumo híbrido, ative manualmente o GUC incremental_guc_hg_experimental_enable_hybrid_incremental_mode. Exemplo:
--Prepare the base table, enable Binlog, and insert data
CREATE TABLE base_sales(
day TEXT NOT NULL,
hour INT,
user_id BIGINT,
ts TIMESTAMPTZ,
amount FLOAT,
pk text NOT NULL PRIMARY KEY
);
-- Import data into the base table
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');
-- Enable Binlog for the base table
ALTER TABLE base_sales SET (binlog_level = replica);
-- Import incremental data into the base table
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');
-- Create an auto-refreshing incremental Dynamic Table and enable the GUC for hybrid consumption
CREATE DYNAMIC TABLE sales_incremental
WITH (
refresh_mode='incremental',
incremental_auto_refresh_schd_start_time = 'immediate',
incremental_auto_refresh_interval = '3 minutes',
incremental_guc_hg_experimental_enable_hybrid_incremental_mode= 'true'
)
AS
SELECT day, hour, SUM(amount), COUNT(1)
FROM base_sales
GROUP BY day, hour;
Verifique a consistência dos dados:
-
Consulte a tabela base
SELECT day, hour, SUM(amount), COUNT(1) FROM base_sales GROUP BY day, hour;Resultado:
day hour sum count 2024-08-29 2 100 1 2024-08-29 1 5 1 -
Consulte a Dynamic Table
SELECT * FROM sales_incremental;Resultado:
day hour sum count 2024-08-29 1 5 1 2024-08-29 2 100 1
Atualização completa
A atualização completa reescreve todo o conjunto de dados a partir da consulta. Em comparação com a atualização incremental:
Suporta mais tipos de tabelas base.
Oferece suporte a um conjunto mais rico de tipos de consulta e operadores.
A atualização completa consome mais recursos. É mais indicada para relatórios periódicos e backfills de dados.
Para mais informações, consulte Full refresh.
Exemplos
V3.1
Exemplo 1: Criar uma Incremental Dynamic Table regular
Antes de prosseguir, importe o conjunto de dados público tpch_10g para o Hologres seguindo o guia em Import public datasets with a few clicks.
Antes de criar uma Incremental Dynamic Table, ative o Binlog para a tabela base (não necessário para tabelas de dimensão).
-- Create an Incremental Dynamic Table that refreshes every 3 minutes.
CREATE DYNAMIC TABLE public.tpch_q1_incremental
WITH (
auto_refresh_mode='incremental',
freshness='3 minutes'
) AS SELECT
l_returnflag,
l_linestatus,
COUNT(*) AS count_order
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus;
Exemplo 2: Criar uma Incremental Dynamic Table a partir de stream-stream joins
Antes de prosseguir, importe o conjunto de dados público tpch_10g para o Hologres seguindo o guia em Import public datasets with a few clicks.
Antes de criar uma Incremental Dynamic Table, ative o binlog para a tabela base (não necessário para a tabela de dimensão).
-- Create an Incremental Dynamic Table from stream-stream joins.
CREATE DYNAMIC TABLE dt_join
WITH (
auto_refresh_mode='incremental',
freshness='30 minutes'
)
AS
SELECT
l_shipmode,
SUM(CASE
WHEN o_orderpriority = '1-URGENT'
OR o_orderpriority = '2-HIGH'
THEN 1
ELSE 0
END) AS high_line_count,
SUM(CASE
WHEN o_orderpriority <> '1-URGENT'
AND o_orderpriority <> '2-HIGH'
THEN 1
ELSE 0
END) AS low_line_count
FROM
hologres_dataset_tpch_10g.orders,
hologres_dataset_tpch_10g.lineitem
WHERE
o_orderkey = l_orderkey
AND l_shipmode IN ('FOB', 'AIR')
AND l_commitdate < l_receiptdate
AND l_shipdate < l_commitdate
AND l_receiptdate >= DATE '1997-01-01'
AND l_receiptdate < DATE '1997-01-01' + INTERVAL '1' YEAR
GROUP BY
l_shipmode;
Exemplo 3: Criar uma Dynamic Table com atualização automática
Defina o modo de atualização como auto. O mecanismo prioriza a atualização incremental e reverte para a atualização completa se não houver suporte.
Antes de prosseguir, importe o conjunto de dados público tpch_10g para o Hologres seguindo o guia em Import public datasets with a few clicks.
-- Create an Auto-refresh Dynamic Table that intelligent decides the refresh mode. In this example, incremental refresh is the result.
CREATE DYNAMIC TABLE thch_q6_auto
WITH (
auto_refresh_mode='auto',
freshness='1 hours'
)
AS
SELECT
SUM(l_extendedprice * l_discount) AS revenue
FROM
hologres_dataset_tpch_100g.lineitem
WHERE
l_shipdate >= DATE '1996-01-01'
AND l_shipdate < DATE '1996-01-01' + INTERVAL '1' YEAR
AND l_discount BETWEEN 0.02 - 0.01 AND 0.02 + 0.01
AND l_quantity < 24;
Exemplo 4: Criar uma Dynamic Table com particionamento lógico
Para painéis de transações em tempo real, frequentemente há necessidade tanto de visualização quase em tempo real dos dados atuais quanto de correção de dados históricos, o que exige uma solução integrada de análise em tempo real e offline (Business and data cognition). Normalmente utilizamos partições lógicas de Dynamic Table para esse cenário. A abordagem é a seguinte:
A tabela base é particionada por dia. A partição mais recente recebe escrita do Flink em tempo real/quase em tempo real, enquanto as partições históricas recebem dados do MaxCompute.
A Dynamic Table é criada como uma tabela com particionamento lógico. As duas partições mais recentes estão ativas e são atualizadas incrementalmente para análises de dados quase em tempo real.
As partições históricas estão inativas e usam atualização completa. Se as partições históricas da tabela base tiverem sido corrigidas ou preenchidas (backfill), elas poderão ser atualizadas usando uma atualização completa.
Este exemplo utiliza um conjunto de dados público do GitHub.
-
Prepare a tabela base.
Use o Flink para gravar os dados mais recentes na tabela base. Para etapas detalhadas, consulte Unified batch and real-time analytics on GitHub events.
DROP TABLE IF EXISTS gh_realtime_data; BEGIN; CREATE TABLE gh_realtime_data ( id BIGINT, actor_id BIGINT, actor_login TEXT, repo_id BIGINT, repo_name TEXT, org_id BIGINT, org_login TEXT, type TEXT, created_at timestamp with time zone NOT NULL, action TEXT, iss_or_pr_id BIGINT, number BIGINT, comment_id BIGINT, commit_id TEXT, member_id BIGINT, rev_or_push_or_rel_id BIGINT, ref TEXT, ref_type TEXT, state TEXT, author_association TEXT, language TEXT, merged BOOLEAN, merged_at TIMESTAMP WITH TIME ZONE, additions BIGINT, deletions BIGINT, changed_files BIGINT, push_size BIGINT, push_distinct_size BIGINT, hr TEXT, month TEXT, year TEXT, ds TEXT, PRIMARY KEY (id,ds) ) PARTITION BY LIST (ds); CALL set_table_property('public.gh_realtime_data', 'distribution_key', 'id'); CALL set_table_property('public.gh_realtime_data', 'event_time_column', 'created_at'); CALL set_table_property('public.gh_realtime_data', 'clustering_key', 'created_at'); COMMENT ON COLUMN public.gh_realtime_data.id IS 'Event ID'; COMMENT ON COLUMN public.gh_realtime_data.actor_id IS 'Event actor ID'; COMMENT ON COLUMN public.gh_realtime_data.actor_login IS 'Event actor login name'; COMMENT ON COLUMN public.gh_realtime_data.repo_id IS 'Repo ID'; COMMENT ON COLUMN public.gh_realtime_data.repo_name IS 'Repo name'; COMMENT ON COLUMN public.gh_realtime_data.org_id IS 'Repo organization ID'; COMMENT ON COLUMN public.gh_realtime_data.org_login IS 'Repo organization name'; COMMENT ON COLUMN public.gh_realtime_data.type IS 'Event type'; COMMENT ON COLUMN public.gh_realtime_data.created_at IS 'Event time'; COMMENT ON COLUMN public.gh_realtime_data.action IS 'Event action'; COMMENT ON COLUMN public.gh_realtime_data.iss_or_pr_id IS 'Issue/pull_request ID'; COMMENT ON COLUMN public.gh_realtime_data.number IS 'Issue/pull_request number'; COMMENT ON COLUMN public.gh_realtime_data.comment_id IS 'Comment ID'; COMMENT ON COLUMN public.gh_realtime_data.commit_id IS 'Commit ID'; COMMENT ON COLUMN public.gh_realtime_data.member_id IS 'Member ID'; COMMENT ON COLUMN public.gh_realtime_data.rev_or_push_or_rel_id IS 'Review/push/release ID'; COMMENT ON COLUMN public.gh_realtime_data.ref IS 'Name of created/deleted resource'; COMMENT ON COLUMN public.gh_realtime_data.ref_type IS 'Type of created/deleted resource'; COMMENT ON COLUMN public.gh_realtime_data.state IS 'State of issue/pull_request/pull_request_review'; COMMENT ON COLUMN public.gh_realtime_data.author_association IS 'Relationship between actor and repo'; COMMENT ON COLUMN public.gh_realtime_data.language IS 'Programming language'; COMMENT ON COLUMN public.gh_realtime_data.merged IS 'Whether merged'; COMMENT ON COLUMN public.gh_realtime_data.merged_at IS 'Merge time'; COMMENT ON COLUMN public.gh_realtime_data.additions IS 'Number of added lines'; COMMENT ON COLUMN public.gh_realtime_data.deletions IS 'Number of deleted lines'; COMMENT ON COLUMN public.gh_realtime_data.changed_files IS 'Number of changed files in pull request'; COMMENT ON COLUMN public.gh_realtime_data.push_size IS 'Number of pushes'; COMMENT ON COLUMN public.gh_realtime_data.push_distinct_size IS 'Number of distinct pushes'; COMMENT ON COLUMN public.gh_realtime_data.hr IS 'Hour of event, e.g., 00 for 00:23'; COMMENT ON COLUMN public.gh_realtime_data.month IS 'Month of event, e.g., 2015-10 for Oct 2015'; COMMENT ON COLUMN public.gh_realtime_data.year IS 'Year of event, e.g., 2015'; COMMENT ON COLUMN public.gh_realtime_data.ds IS 'Date of event, ds=yyyy-mm-dd'; COMMIT; -
Crie uma Dynamic Table com particionamento lógico.
CREATE DYNAMIC TABLE ads_dt_github_event LOGICAL PARTITION BY LIST(ds) WITH ( -- Dynamic table properties freshness = '5 minutes', auto_refresh_mode = 'auto', auto_refresh_partition_active_time = '2 days' , partition_key_time_format = 'YYYY-MM-DD' ) AS SELECT repo_name, COUNT(*) AS events, ds FROM gh_realtime_data GROUP BY repo_name,ds -
Consulte a Dynamic Table.
SELECT * FROM ads_dt_github_event ; -
Faça backfill de uma partição histórica.
Se os dados históricos na tabela base mudarem (ex.: dados de '2025-04-01') e a Dynamic Table precisar ser atualizada, defina a partição histórica para o modo de atualização completa e acione uma atualização, preferencialmente com recursos de Serverless Computing.
REFRESH OVERWRITE DYNAMIC TABLE ads_dt_github_event PARTITION (ds = '2025-04-01') WITH ( refresh_mode = 'full' );
Exemplo 5: Calcular UVs com Incremental Dynamic Table
A partir do Hologres V3.1, uma Incremental Dynamic Table suporta a função RB_BUILD_AGG para cálculos como o número de UVs. Comparado à pré-agregação, isso oferece:
Desempenho mais rápido: Computa apenas dados incrementais.
Custo menor: Volume de dados e uso de recursos reduzidos, permitindo cálculos em períodos mais longos.
Exemplo:
-
Prepare uma tabela de detalhes de usuário.
BEGIN; CREATE TABLE IF NOT EXISTS ods_app_detail ( uid INT, country TEXT, prov TEXT, city TEXT, channel TEXT, operator TEXT, brand TEXT, ip TEXT, click_time TEXT, year TEXT, month TEXT, day TEXT, ymd TEXT NOT NULL ); CALL set_table_property('ods_app_detail', 'orientation', 'column'); CALL set_table_property('ods_app_detail', 'bitmap_columns', 'country,prov,city,channel,operator,brand,ip,click_time, year, month, day, ymd'); -- Set distribution_key based on query needs for optimal sharding effect. CALL set_table_property('ods_app_detail', 'distribution_key', 'uid'); -- For a field with full date-time used in WHERE filters, setting it as clustering_key and event_time_column is recommended. CALL set_table_property('ods_app_detail', 'clustering_key', 'ymd'); CALL set_table_property('ods_app_detail', 'event_time_column', 'ymd'); COMMIT; -
Calcule UV usando uma Incremental Dynamic Table.
CREATE DYNAMIC TABLE ads_uv_dt WITH ( freshness = '5 minutes', auto_refresh_mode = 'incremental') AS SELECT RB_BUILD_AGG(uid), country, prov, city, ymd, COUNT(1) FROM ods_app_detail WHERE ymd >= '20231201' AND ymd <='20240502' GROUP BY country,prov,city,ymd; -
Consulte UV para um dia específico.
SELECT RB_CARDINALITY(RB_OR_AGG(rb_uid)) AS uv, country, prov, city, SUM(pv) AS pv FROM ads_uv_dt WHERE ymd = '20240329' GROUP BY country,prov,city;
V3.0
Exemplo 1: Criar uma dynamic table de atualização completa com início automático
Antes de prosseguir, importe o conjunto de dados público tpch_10g para o Hologres seguindo o guia em Import public datasets with a few clicks.
--Create "test" Schema
CREATE SCHEMA test;
--Create a single-table full refresh dynamic table, starting immediately and refreshing every hour.
CREATE DYNAMIC TABLE test.thch_q1_full
WITH (
refresh_mode='full',
auto_refresh_enable='true',
full_auto_refresh_interval='1 hours',
full_guc_hg_computing_resource='serverless',
full_guc_hg_experimental_serverless_computing_required_cores='32'
)
AS
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus;
Exemplo 2: Criar uma dynamic table incremental com horário de início
Antes de prosseguir, importe o conjunto de dados público tpch_10g para o Hologres seguindo o guia em Import public datasets with a few clicks.
Exemplo:
Antes de criar uma Dynamic Table incremental, você deve ativar o Binlog para a tabela base (não necessário para tabelas de dimensão).
--Enable binlog for the base table:
BEGIN;
CALL set_table_property('hologres_dataset_tpch_10g.lineitem', 'binlog.level', 'replica');
COMMIT;
--Create a single-table incremental refresh dynamic table, specifying a start time and a 3-minute refresh interval.
CREATE DYNAMIC TABLE public.tpch_q1_incremental
WITH (
refresh_mode='incremental',
auto_refresh_enable='true',
incremental_auto_refresh_schd_start_time='2024-09-15 23:50:0',
incremental_auto_refresh_interval='3 minutes',
incremental_guc_hg_computing_resource='serverless',
incremental_guc_hg_experimental_serverless_computing_required_cores='30'
) AS SELECT
l_returnflag,
l_linestatus,
COUNT(*) AS count_order
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus
;
Exemplo 3: Criar uma dynamic table de atualização completa com múltiplos joins
--Create a dynamic table with a multi-table join query, using full refresh mode every 3 hours.
CREATE DYNAMIC TABLE dt_q_full
WITH (
refresh_mode='full',
auto_refresh_enable='true',
full_auto_refresh_schd_start_time='immediate',
full_auto_refresh_interval='3 hours',
full_guc_hg_computing_resource='serverless',
full_guc_hg_experimental_serverless_computing_required_cores='64'
)
AS
SELECT
o_orderpriority,
COUNT(*) AS order_count
FROM
hologres_dataset_tpch_10g.orders
WHERE
o_orderdate >= DATE '1996-07-01'
AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH
AND EXISTS (
SELECT
*
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_orderkey = o_orderkey
AND l_commitdate < l_receiptdate
)
GROUP BY
o_orderpriority;
Exemplo 4: Criar uma dynamic table incremental com join de dimensão
Exemplo:
Antes de criar uma Dynamic Table incremental, você deve ativar o Binlog para a tabela base (não necessário para tabelas de dimensão).
A semântica de um JOIN com tabela de dimensão é que cada registro é unido apenas à versão mais recente dos dados da tabela de dimensão naquele momento, ou seja, o JOIN ocorre no tempo de processamento. Se os dados da tabela de dimensão mudarem (adição, atualização ou exclusão) após o JOIN, os dados já unidos não serão atualizados. Exemplo SQL:
--Detail table
BEGIN;
CREATE TABLE public.sale_detail(
app_id TEXT,
uid TEXT,
product TEXT,
gmv BIGINT,
order_time TIMESTAMPTZ
);
--Enable binlog for the base table; dimension tables do not require it.
CALL set_table_property('public.sale_detail', 'binlog.level', 'replica');
COMMIT;
--Property table
CREATE TABLE public.user_info(
uid TEXT,
province TEXT,
city TEXT
);
CREATE DYNAMIC TABLE public.dt_sales_incremental
WITH (
refresh_mode='incremental',
auto_refresh_enable='true',
incremental_auto_refresh_schd_start_time='2024-09-15 00:00:00',
incremental_auto_refresh_interval='5 minutes',
incremental_guc_hg_computing_resource='serverless',
incremental_guc_hg_experimental_serverless_computing_required_cores='128')
AS
SELECT
sale_detail.app_id,
sale_detail.uid,
product,
SUM(sale_detail.gmv) AS sum_gmv,
sale_detail.order_time,
user_info.province,
user_info.city
FROM public.sale_detail
INNER JOIN public.user_info FOR SYSTEM_TIME AS OF PROCTIME()
ON sale_detail.uid =user_info.uid
GROUP BY sale_detail.app_id,sale_detail.uid,sale_detail.product,sale_detail.order_time,user_info.province,user_info.city;
Exemplo 5: Criar uma dynamic table particionada
Para painéis de transações em tempo real, frequentemente há necessidade tanto de visualização quase em tempo real dos dados atuais quanto de correção de dados históricos. Isso pode ser alcançado usando uma combinação de atualização incremental e completa da Dynamic Table. A abordagem é a seguinte:
Crie uma tabela base particionada onde a partição mais recente recebe escrita em tempo real/quase em tempo real, e as partições históricas são ocasionalmente corrigidas.
Crie uma
Dynamic Tablecomo tabela pai particionada. Use atualização incremental para a partição mais recente para atender às necessidades de análise quase em tempo real.Alterne as partições históricas para o modo de atualização completa. Se as partições históricas da tabela de origem tiverem sido corrigidas, as partições da
Dynamic Tabletambém poderão sofrer backfill usando atualização completa, preferencialmente com Serverless para acelerar o processo.
Exemplo:
-
Prepare a tabela base e os dados.
A tabela base é uma tabela particionada, com a partição mais recente recebendo dados em tempo real.
-- Create a partitioned source table CREATE TABLE base_sales( uid INT, opreate_time TIMESTAMPTZ, amount FLOAT, tt TEXT NOT NULL, ds TEXT, PRIMARY KEY(ds) ) PARTITION BY LIST (ds) ; --Historical partition CREATE TABLE base_sales_20240615 PARTITION OF base_sales FOR VALUES IN ('20240615'); INSERT INTO base_sales_20240615 VALUES (2,'2024-06-15 16:18:25.387466+08','111','2','20240615'); --Latest partition, typically for real-time writes CREATE TABLE base_sales_20240616 PARTITION OF base_sales FOR VALUES IN ('20240616'); INSERT INTO base_sales_20240616 VALUES (1,'2024-06-16 16:08:25.387466+08','2','1','20240616'); -
Crie uma tabela pai
Dynamic Tableparticionada, definindo apenas a consulta sem um modo de atualização.--Create extension CREATE EXTENSION roaringbitmap; CREATE DYNAMIC TABLE partition_dt_base_sales PARTITION BY LIST (ds) as SELECT public.RB_BUILD_AGG(uid), opreate_time, amount, tt, ds, COUNT(1) FROM base_sales GROUP BY opreate_time ,amount,tt,ds; -
Crie sub-tabelas e defina seus modos de atualização.
Você pode criar sub-partições da
Dynamic Tablemanualmente ou dinamicamente usando DataWorks. Defina a partição mais recente para atualização incremental e as partições históricas para atualização completa.-- Enable Binlog for the base table ALTER TABLE base_sales SET (binlog_level = replica); -- Assume the historical Dynamic Table sub-partition is as follows: CREATE DYNAMIC TABLE partition_dt_base_sales_20240615 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240615') WITH ( refresh_mode='incremental', auto_refresh_enable='true', incremental_auto_refresh_schd_start_time='immediate', incremental_auto_refresh_interval='30 minutes' ); -- Create a new Dynamic Table sub-partition, set its refresh mode to incremental, start immediately, refresh every 30 minutes, and use instance resources. CREATE DYNAMIC TABLE partition_dt_base_sales_20240616 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240616') WITH ( refresh_mode='incremental', auto_refresh_enable='true', incremental_auto_refresh_schd_start_time='immediate', incremental_auto_refresh_interval='30 minutes' ); --Switch the historical partition to full refresh mode ALTER DYNAMIC TABLE partition_dt_base_sales_20240615 SET (refresh_mode = 'full'); --If historical partition data needs correction, execute a refresh, preferably with serverless. SET hg_computing_resource = 'serverless'; REFRESH DYNAMIC TABLE partition_dt_base_sales_20240615;
Converter sintaxe legada para nova sintaxe
O Hologres V3.1 alterou a sintaxe de criação da Dynamic Table. Após atualizar da V3.0, recrie as Dynamic Tables com a nova sintaxe. Uma ferramenta de conversão simplifica esse processo.
Cenários
Incremental Dynamic Tables devem ser recriadas com a nova sintaxe.
Incompatibilidades de sintaxe encontradas durante a verificação de atualização. Consulte seu relatório de verificação de atualização para detalhes.
Exceto pelos cenários acima, as Dynamic Tables da V3.0 não exigem recriação no Hologres V3.1. No entanto, apenas ALTER DYNAMIC TABLE pode ser executado nelas. CREATE DYNAMIC TABLE (sintaxe antiga) não é suportado na V3.1+.
Limitações
O comando de conversão de sintaxe é restrito a tabelas não particionadas (tanto Incremental quanto Full-refresh). Para Dynamic Tables particionadas da V3.0, recrie-as manualmente.
Visualizar Dynamic Tables que requerem conversão de sintaxe
Encontre tabelas em sua instância que precisam de conversão após uma atualização:
Tabelas não particionadas
SELECT DISTINCT
p.dynamic_table_namespace as table_namespace,
p.dynamic_table_name as table_name
FROM hologres.hg_dynamic_table_properties p
JOIN pg_class c ON c.relname = p.dynamic_table_name
JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = p.dynamic_table_namespace
WHERE p.property_key = 'refresh_mode'
AND p.property_value = 'incremental'
AND c.relispartition = false
AND c.relkind != 'p';
Tabelas particionadas
SELECT DISTINCT
pn.nspname as parent_schema,
pc.relname as parent_name
FROM hologres.hg_dynamic_table_properties p
JOIN pg_class c ON c.relname = p.dynamic_table_name
JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = p.dynamic_table_namespace
JOIN pg_inherits i ON c.oid = i.inhrelid
JOIN pg_class pc ON pc.oid = i.inhparent
JOIN pg_namespace pn ON pn.oid = pc.relnamespace
WHERE p.property_key = 'refresh_mode'
AND p.property_value = 'incremental'
AND c.relispartition = true
AND c.relkind != 'p';
Executar conversão de sintaxe
Observações:
Requisito de versão: V3.1.11 e posteriores.
Requisito de função: Superuser.
-
Mudanças de comportamento pós-conversão:
A atualização automática inicia imediatamente se o modo de atualização for
auto. Garanta que a operação ocorra fora dos horários de pico para evitar contenção de recursos. Para melhor isolamento, use recursos de Serverless Computing.-
Mudanças no uso de recursos para instâncias de virtual warehouse:
V3.1/V3.2 (nova sintaxe): A atualização de Dynamic Tables usa recursos dos virtual warehouses primários dos Table Groups das tabelas base e dinâmicas.
V3.0 (sintaxe legada) e V4.1 (nova sintaxe): A atualização de Dynamic Tables usa recursos do virtual warehouse primário do Table Group da Dynamic Table.
A nova sintaxe adiciona uma conexão por Dynamic Table para agendamento. Se sua instância tiver alto uso de conexões, limpe as conexões ociosas primeiro.
Comandos:
-- Only for non-partitioned tables (full and incremental).
-- Convert a single Dynamic Table
call hg_dynamic_table_config_upgrade('<table_name>');
-- Convert all Dynamic Tables. Use with caution.
call hg_upgrade_all_normal_dynamic_tables();
Estes comandos convertem Dynamic Tables (sintaxe antiga) no banco de dados atual para a nova sintaxe.
Mapeamentos de parâmetros de sintaxe
O comando mapeia parâmetros e valores da V3.0 e V3.1 da seguinte forma:
|
Sintaxe legada (V3.0) |
Nova sintaxe (V3.1+) |
Descrição |
|
|
|
O valor do parâmetro é preservado após a conversão. Por exemplo, |
|
|
|
O valor do parâmetro é preservado após a conversão. |
|
|
|
O valor de Ex.: |
|
|
||
|
|
|
O valor do parâmetro é preservado após a conversão. Ex.: |
|
|
|
O valor do parâmetro é preservado após a conversão. |
|
|
|
O valor do parâmetro é preservado após a conversão. Por exemplo, |
|
Propriedades da tabela (ex.: |
Propriedades da tabela (ex.: |
As propriedades básicas da tabela permanecem inalteradas. |
Referências
FAQ
-
P: Como corrijo o erro com chave de segmento ou clusterização nula? Exemplo:
ERROR: commit ddl phase1 failed: the index partition key "xxx" should not be nullable Causa: A chave de segmento ou clusterização de uma Dynamic Table não pode ser nula. Para regras sobre como definir essas chaves, consulte Event time column (segment key).
-
Solução:
-
Erro de chave de clusterização: Para versões do Hologres anteriores à V3.1.26, V3.2.9, V4.0.0, atualize sua instância e modifique o seguinte GUC para permitir uma chave de clusterização anulável:
-- For V3.1 and later ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (refresh_guc_hg_experimental_enable_nullable_segment_key=true); -
Erro de chave de segmento: Execute o seguinte comando para permitir uma chave de segmento anulável. A partir do Hologres V4.1, chaves de segmento anuláveis são permitidas por padrão, portanto recomendamos atualizar sua instância para corrigir o erro.
--For V3.1 and later, allows a nullable clustering key ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (refresh_guc_hg_experimental_enable_nullable_clustering_key=true);
-