O Hologres é um data warehouse em tempo real totalmente gerenciado e compatível com PostgreSQL. Este guia orienta a migração de schemas, dados e consultas de uma instância auto-gerenciada do ClickHouse para o Hologres.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do Hologres em execução. Consulte Comprar uma instância do Hologres
Uma instância do ClickHouse com o cliente do ClickHouse instalado. Baixe o ClickHouse-Client. Para detalhes de instalação, consulte Getting started
Um cliente psql conectado à sua instância do Hologres. Consulte Cliente PSQL
Contexto
O ClickHouse é um sistema de gerenciamento de banco de dados (DBMS) orientado a colunas, projetado para processamento analítico online (OLAP). O Hologres expande essa capacidade com compatibilidade com PostgreSQL, consultas pontuais de alto QPS (consultas por segundo), suporte completo a JOIN entre múltiplas tabelas e um otimizador baseado em custo (CBO). A tabela abaixo resume as principais diferenças.
|
Categoria |
Critério |
ClickHouse |
Hologres |
|
Produto |
Finalidade |
Análise de tráfego de rede |
Data warehouse em tempo real de uso geral: análise de dados e serviços online |
|
Escrita |
Armazenamento |
Armazenamento em colunas |
Armazenamento em colunas e linhas |
|
Visibilidade da escrita |
Nível de segundos (requer batching no lado do cliente; escritas em tabelas distribuídas dependem da conclusão da replicação do shard) |
Nível de milissegundos (batching de escrita adaptativo; consultável imediatamente após a escrita) |
|
|
Desempenho de escrita |
Alto |
Muito alto |
|
|
Armazenamento de detalhes |
Suportado |
Suportado |
|
|
Chave primária |
Não é uma chave primária de banco de dados verdadeira (sem restrição de unicidade; usada apenas para indexação e agregação) |
Chave primária de banco de dados padrão com suporte a restrição de unicidade |
|
|
Atualizável |
Incompleto (não suporta atualizações de alto QPS baseadas em chaves primárias) |
Totalmente suportado (suporta atualizações de alto QPS baseadas em chaves primárias) |
|
|
Escrita em tempo real |
Append |
Append / insert or ignore / insert or replace / update |
|
|
Índice |
primary key, minmax, ngram, token, bloom filter |
bitmap, dictionary, segment, primary, clustering (cria automaticamente índices minmax, bloom filter e ngram) |
|
|
Consulta |
Otimizador |
Otimizador baseado em regras (RBO) |
Otimizador baseado em custo (CBO) |
|
Consulta federada |
Suportado (HDFS e Kafka) |
Suportado (FDW lê MaxCompute e Hive diretamente) |
|
|
Pré-agregação |
Suportado (via MergeTree) |
Suportado (via stored procedures e jobs agendados) |
|
|
Consulta pontual de alto QPS |
Não suportado |
Suportado; QPS excede dezenas de milhões |
|
|
Consulta complexa de tabela única |
Bom |
Bom |
|
|
JOIN de múltiplas tabelas |
Fraco |
Bom |
|
|
Sintaxe SQL |
Sintaxe personalizada |
Compatível com PostgreSQL |
|
|
Funções de janela |
Não suportado |
Suportado |
|
|
Transação |
ACID |
Não (consistência eventual; sem garantia de consultabilidade imediata) |
Limitado (transações DDL, transações de linha única, visibilidade baseada em snapshot) |
|
Recuperação de desastres |
Backup |
Replicação via ZooKeeper + ClickHouse |
Replicação lógica via Binlog; replicação física via mecanismos subjacentes |
|
Recursos avançados |
Binlog |
Nenhum |
Suportado |
|
Busca vetorial |
Suportado (ClickHouse 22.8+) |
Suportado |
|
|
Dados espaciais |
Não suportado |
Suportado |
|
|
Segurança |
Permissões personalizadas |
Modelo de permissão compatível com PostgreSQL com listas de permissões de IP e mascaramento de dados |
|
|
Separação armazenamento-computação |
Não separado; limitado pela capacidade de nó único |
Separado; capacidade de armazenamento quase ilimitada |
|
|
Disponibilidade |
Failover manual |
Recuperação automática de failover |
|
|
O&M |
Complexo (distribuição manual de shards) |
Totalmente gerenciado |
|
|
Ecossistema |
Ingestão de dados |
Kafka, Flink, Spark |
Flink, Spark, JDBC, DataX |
|
Ferramentas de BI |
Limitado (Tableau, Superset) |
Ecossistema PostgreSQL; suporta mais de 100 ferramentas de BI principais |
Mapeamento de tipos de dados
ClickHouse e Hologres utilizam sistemas de tipos diferentes. As tabelas abaixo mapeiam cada tipo do ClickHouse para seu equivalente no Hologres e destacam pontos de atenção durante a conversão.
Tipos numéricos
O ClickHouse oferece tipos inteiros com e sem sinal em várias precisões. O Hologres usa a hierarquia padrão de inteiros SQL. Diferença principal: o ClickHouse não possui um tipo Boolean nativo; o Hologres suporta BOOLEAN nativamente.
|
Tipo ClickHouse |
Tipo Hologres |
Observações |
|
Int8 |
SMALLINT |
INT de byte único não é suportado; use SMALLINT |
|
Int16 |
SMALLINT |
|
|
Int32 |
INT |
|
|
Int64 |
BIGINT |
|
|
UInt8 |
INT |
|
|
UInt16 |
INT |
|
|
UInt32 |
BIGINT |
|
|
UInt64 |
BIGINT |
Valores UInt64 próximos ao máximo (18.446.744.073.709.551.615) excedem o intervalo do BIGINT; valide os dados antes de migrar |
|
Float32 |
FLOAT |
|
|
Float64 |
DOUBLE PRECISION |
|
|
Decimal(P, S) |
DECIMAL |
|
|
Decimal32(S) |
DECIMAL |
|
|
Decimal64(S) |
DECIMAL |
|
|
Decimal128(S) |
DECIMAL |
|
|
Boolean |
BOOLEAN |
O ClickHouse não possui tipo Boolean; use UInt8 no ClickHouse para representar valores booleanos |
Tipos de string e caractere
O ClickHouse armazena todos os dados de string como bytes brutos com o tipo String. O Hologres mapeia isso para TEXT. O LowCardinality é uma otimização de armazenamento do ClickHouse sem equivalente direto no Hologres. Após a migração, ative a codificação de dicionário manualmente nas colunas correspondentes.
|
Tipo ClickHouse |
Tipo Hologres |
Observações |
|
String |
TEXT |
|
|
FixString(N) |
TEXT |
Strings de comprimento fixo tornam-se de comprimento variável; não há equivalente de string de comprimento fixo no Hologres |
|
LowCardinality(T) |
TEXT (ou tipo subjacente) |
Não suportado como tipo nativo. Após a migração, ative a codificação de dicionário manualmente: |
Tipos de data e hora
O ClickHouse usa Date e várias variantes de DateTime. O Hologres mapeia todos os tipos com fuso horário para TIMESTAMPTZ.
|
Tipo ClickHouse |
Tipo Hologres |
Observações |
|
Date |
Date |
|
|
DateTime |
TIMESTAMPTZ |
|
|
DateTime(timezone) |
TIMESTAMPTZ |
|
|
DateTime64 |
TIMESTAMPTZ |
Tipos complexos e outros
Estruturas aninhadas no ClickHouse (como Nested e Tuple) são convertidas em arrays no Hologres. Para dados binários, escolha o tipo do Hologres conforme seu caso de uso.
|
Tipo ClickHouse |
Tipo Hologres |
Observações |
|
UUID |
UUID |
|
|
Enum |
TEXT |
Não suportado como tipo nativo; use TEXT |
|
Nested, Tuple, Array |
Array |
Tipos aninhados são convertidos em arrays |
|
Binary |
BIT(n), VARBIT(n), BYTEA, CHAR(n) |
Escolha conforme o caso de uso |
Migrar schemas
A migração de schema converte instruções de linguagem de definição de dados (DDL) do ClickHouse para DDL do Hologres (compatível com PostgreSQL). Siga as etapas abaixo.
Etapa 1: Listar todos os bancos de dados
Execute o comando a seguir no cliente do ClickHouse para listar os bancos de dados na instância de origem.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW databases" > database.list
O banco de dados system aparece nos resultados, mas não precisa ser migrado. Filtre-o.
|
Parâmetro |
Descrição |
|
|
Endereço da instância do ClickHouse de origem |
|
|
Porta da instância do ClickHouse de origem |
|
|
Conta com permissões de leitura/gravação DML, configurações e DDL |
|
|
Senha da conta |
Etapa 2: Listar todas as tabelas
Execute o comando a seguir no cliente do ClickHouse para listar as tabelas em um banco de dados específico.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW tables from <database_name>" > table.list
Tabelas que começam com .inner. são tabelas internas para visualizações materializadas e não precisam ser migradas. Filtre-as.
Para listar todos os bancos de dados e tabelas simultaneamente, consulte a tabela de metadados system.tables:
SELECT DISTINCT database, name FROM system.tables WHERE database != 'system';
Etapa 3: Exportar DDL da tabela
Exporte o DDL de cada tabela que deseja migrar.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW CREATE TABLE <database_name>.<table_name>" > table.sql
Alternativamente, consulte system.tables diretamente para inspecionar o DDL e os metadados de todas as tabelas não distribuídas:
SELECT * FROM system.tables
WHERE database = '<database_name>' AND engine != 'Distributed';
A tabela a seguir explica como cada campo de system.tables mapeia para conceitos do Hologres.
|
Campo |
Regra de mapeamento |
|
|
Bancos de dados do ClickHouse mapeiam para schemas no Hologres. |
|
|
Nome da tabela; nenhuma alteração necessária |
|
|
O Hologres não distingue tabelas Local/Distributed. Filtre linhas onde |
|
|
Tabelas temporárias não precisam ser migradas. O Hologres não suporta tabelas temporárias |
|
|
Ignorar |
|
|
Crie visualizações com dependências antes das tabelas base. O Hologres não suporta visualizações materializadas |
|
|
DDL de origem; converta para DDL do Hologres (sintaxe PostgreSQL) |
|
|
Ignorar |
|
|
Mapeia para a chave de partição no Hologres. Se |
|
|
Mapeia para índices de chave de segmento e chave de clustering no Hologres |
|
|
Mapeia para a cláusula |
|
|
O Hologres não suporta amostragem; ignorar |
|
|
Ignorar |
Etapa 4: Converter DDL do ClickHouse para DDL do Hologres
Aplique os mapeamentos de tipos e as regras de conversão de campos para converter o DDL de cada tabela. Os exemplos a seguir usam tabelas de benchmark TPC-H.
Exemplo: tabela lineitem
DDL do ClickHouse:
-- lineitem on ClickHouse
CREATE TABLE lineitem_local ON CLUSTER default(
l_orderkey UInt64,
l_partkey UInt32,
l_suppkey UInt32,
l_linenumber UInt32,
l_quantity decimal(15,2),
l_extendedprice decimal(15,2),
l_discount decimal(15,2),
l_tax decimal(15,2),
l_returnflag LowCardinality(String),
l_linestatus LowCardinality(String),
l_shipdate Date,
l_commitdate Date,
l_receiptdate Date,
l_shipinstruct LowCardinality(String),
l_shipmode LowCardinality(String),
l_comment LowCardinality(String)
) ENGINE = MergeTree
PARTITION BY toYear(l_shipdate)
ORDER BY (l_orderkey, l_linenumber);
CREATE TABLE lineitem ON CLUSTER default AS lineitem_local
ENGINE = Distributed(default, default, lineitem_local, l_orderkey);
DDL convertido para Hologres:
-- lineitem on Hologres
-- Create a table group with 32 shards
CALL hg_create_table_group ('lineitem_tg', 32);
BEGIN;
CREATE TABLE LINEITEM (
L_ORDERKEY BIGINT NOT NULL,
L_PARTKEY INT NOT NULL,
L_SUPPKEY INT NOT NULL,
L_LINENUMBER INT NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG TEXT NOT NULL,
L_LINESTATUS TEXT NOT NULL,
L_SHIPDATE TIMESTAMPTZ NOT NULL,
L_COMMITDATE TIMESTAMPTZ NOT NULL,
L_RECEIPTDATE TIMESTAMPTZ NOT NULL,
L_SHIPINSTRUCT TEXT NOT NULL,
L_SHIPMODE TEXT NOT NULL,
L_COMMENT TEXT NOT NULL,
PRIMARY KEY (L_ORDERKEY, L_LINENUMBER)
);
-- sorting_key (l_orderkey, l_linenumber) maps to clustering key and segment key
CALL set_table_property('LINEITEM', 'clustering_key', 'L_SHIPDATE,L_ORDERKEY');
CALL set_table_property('LINEITEM', 'segment_key', 'L_SHIPDATE');
CALL set_table_property('LINEITEM', 'table_group', 'lineitem_tg');
CALL set_table_property('LINEITEM', 'distribution_key', 'L_ORDERKEY');
-- LowCardinality columns: enable bitmap and dictionary encoding
CALL set_table_property('LINEITEM', 'bitmap_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
CALL set_table_property('LINEITEM', 'dictionary_encoding_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
CALL set_table_property('LINEITEM', 'time_to_live_in_seconds', '31536000');
COMMIT;
Exemplo: tabela customer
DDL do ClickHouse:
-- customer on ClickHouse
CREATE TABLE customer_local ON CLUSTER default(
c_custkey UInt32,
c_name String,
c_address String,
c_nationkey UInt32,
c_phone LowCardinality(String),
c_acctbal decimal(15,2),
c_mktsegment LowCardinality(String),
c_comment LowCardinality(String)
) ENGINE = MergeTree
ORDER BY (c_custkey);
CREATE TABLE customer ON CLUSTER default AS customer_local
ENGINE = Distributed(default, default, customer_local, c_custkey);
DDL convertido para Hologres:
-- customer on Hologres
BEGIN;
CREATE TABLE CUSTOMER (
C_CUSTKEY INT NOT NULL PRIMARY KEY,
C_NAME TEXT NOT NULL,
C_ADDRESS TEXT NOT NULL,
C_NATIONKEY INT NOT NULL,
C_PHONE TEXT NOT NULL,
C_ACCTBAL DECIMAL(15,2) NOT NULL,
C_MKTSEGMENT TEXT NOT NULL,
C_COMMENT TEXT NOT NULL
);
CALL set_table_property('CUSTOMER', 'distribution_key', 'C_CUSTKEY');
CALL set_table_property('CUSTOMER', 'table_group', 'lineitem_tg');
CALL set_table_property('CUSTOMER', 'bitmap_columns', 'C_CUSTKEY,C_NATIONKEY,C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
CALL set_table_property('CUSTOMER', 'dictionary_encoding_columns', 'C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
CALL set_table_property('CUSTOMER', 'time_to_live_in_seconds', '31536000');
COMMIT;
Etapa 5: Importar DDL para o Hologres
Execute o comando a seguir no cliente psql para aplicar o DDL convertido na instância do Hologres de destino.
PGUSER="<username>" PGPASSWORD="<password>" psql \
-h "<host>" -p "<port>" -d "<database_name>" -f table.sql
Migrar dados
Há três métodos disponíveis. Escolha conforme o volume de dados, os requisitos de latência e as ferramentas existentes.
|
Método |
Mais indicado para |
Ferramentas |
|
Exportar para CSV e usar COPY (recomendado) |
Migração em lote única; configuração simples; sem necessidade de infraestrutura adicional |
Cliente ClickHouse + psql |
|
Job Flink ou Spark |
Migração em grande escala; sincronização em tempo real ou incremental; equipes com infraestrutura Flink/Spark existente |
Flink, Spark |
|
Data Integration do DataWorks ou DataX |
Migração gerenciada sem código personalizado; sincronização offline de banco de dados completo |
DataWorks, DataX |
Para Flink e Spark, consulte Importar dados usando Spark. Para o Data Integration do DataWorks, consulte Data Integration e Sincronizar um banco de dados ClickHouse inteiro para o Hologres offline.
As etapas a seguir descrevem a abordagem de exportação para CSV e COPY.
Etapa 1: Exportar dados do ClickHouse para CSV
O formato CSV é recomendado pela simplicidade e amplo suporte a ferramentas. Para tabelas com tipos aninhados complexos ou decimais de alta precisão, valide os valores exportados antes do carregamento, pois o CSV não preserva metadados de tipo.
Execute o comando a seguir no cliente do ClickHouse para exportar os dados da tabela para um arquivo CSV local.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SELECT * FROM <database_name>.<table_name> FORMAT CSV" > table.csv
|
Parâmetro |
Descrição |
|
|
Endereço da instância do ClickHouse de origem |
|
|
Porta da instância do ClickHouse de origem |
|
|
Conta com permissões de leitura/gravação DML, configurações e DDL |
|
|
Senha da conta |
|
|
Nome do banco de dados que contém a tabela a migrar |
|
|
Nome da tabela a migrar |
Etapa 2: Importar o arquivo CSV para o Hologres
Execute o comando a seguir no cliente psql para carregar o arquivo CSV na tabela do Hologres de destino.
PGUSER="<username>" PGPASSWORD="<password>" psql \
-h "<host>" -p "<port>" -d "<database_name>" \
-c "COPY <schema_name>.<table_name> FROM STDIN (FORMAT 'csv')" < table.csv
|
Parâmetro |
Descrição |
|
|
AccessKey ID da sua conta Alibaba Cloud. Obtenha-o em AccessKey Management |
|
|
AccessKey secret da sua conta Alibaba Cloud. Obtenha-o em AccessKey Management |
|
|
Endpoint da instância do Hologres. Encontre-o na página de detalhes da instância, em Network Information, no Management Console |
|
|
Porta da instância do Hologres. Encontre-a em Network Information no Management Console |
|
|
Nome do banco de dados de destino na instância do Hologres |
|
|
Nome do schema de destino. O padrão é |
|
|
Nome da tabela de destino no Hologres |
Etapa 3: Verificar a importação
Consulte a tabela importada no Hologres para confirmar se os dados foram carregados corretamente.
SELECT COUNT(*) FROM <schema_name>.<table_name>;
Migrar consultas
O Hologres usa sintaxe PostgreSQL, enquanto o ClickHouse utiliza seu próprio dialeto SQL. A maioria das instruções é compatível, mas funções escalares, funções de agregação e aspas de identificadores diferem.
Diferenças de sintaxe
|
Área |
ClickHouse |
Hologres |
|
Identificadores de string |
|
|
|
Referência de tabela |
|
|
Equivalências de funções
Funções não listadas abaixo possuem sintaxe idêntica em ambos os sistemas.
|
ClickHouse |
Hologres |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Use um literal numérico diretamente (ex.: |
Estratégias de migração
Substituição por expressão regular: use regex para substituir padrões fixos, como nomes de funções, aspas de identificadores e referências <database>.<table> pelos equivalentes no Hologres.
Extensão ClickHouse: o Hologres fornece uma Extensão ClickHouse que suporta nativamente algumas funções do ClickHouse, como toUInt32(), sem necessidade de conversão. Consulte Funções compatíveis com ClickHouse.
Exemplos de migração de consultas
Os exemplos a seguir usam consultas de benchmark TPC-H. Cada exemplo destaca um padrão específico de migração.
Exemplo 1: Agregação simples — nenhuma alteração necessária
Para agregações diretas que usam funções SQL padrão, as consultas do ClickHouse e do Hologres são idênticas.
ClickHouse (Q1):
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 lineitem
WHERE l_shipdate <= date '1998-12-01' - interval '90' day
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;
Hologres (Q1) — sem alterações:
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 lineitem
WHERE l_shipdate <= date '1998-12-01' - interval '90' day
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;
Exemplo 2: Reescrita de subconsulta — IN para EXISTS
O ClickHouse suporta IN (subquery) com referências cruzadas entre tabelas de uma forma que o Hologres não suporta. Reescreva usando EXISTS.
ClickHouse (Q4):
SELECT
o_orderpriority,
count(*) AS order_count
FROM orders
WHERE o_orderdate >= date '1993-07-01'
AND o_orderdate < date '1993-07-01' + interval '3' month
AND o_orderdate IN (
SELECT o_orderdate
FROM lineitem, orders
WHERE l_orderkey = o_orderkey
AND l_commitdate < l_receiptdate
)
GROUP BY o_orderpriority
ORDER BY o_orderpriority;
Hologres (Q4) — IN (subquery) substituído por EXISTS:
SELECT
o_orderpriority,
count(*) AS order_count
FROM orders
WHERE o_orderdate >= date '1993-07-01'
AND o_orderdate < date '1993-07-01' + interval '3' month
AND EXISTS (
SELECT *
FROM lineitem
WHERE l_orderkey = o_orderkey
AND l_commitdate < l_receiptdate
)
GROUP BY o_orderpriority
ORDER BY o_orderpriority;
Exemplo 3: Substituição de função — toDecimal32() para um literal
A função toDecimal32(value, scale) do ClickHouse não possui equivalente no Hologres. Substitua-a por um literal numérico simples.
ClickHouse (Q11):
SELECT
ps_partkey,
sum(ps_supplycost * ps_availqty) AS value
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey
AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
GROUP BY ps_partkey
HAVING sum(ps_supplycost * ps_availqty) > (
SELECT sum(ps_supplycost * ps_availqty) * toDecimal32(0.0000010000, 9)
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey
AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
)
ORDER BY value DESC
LIMIT 100;
Hologres (Q11) — toDecimal32(0.0000010000, 9) substituído por 0.0000010000:
SELECT
ps_partkey,
sum(ps_supplycost * ps_availqty) AS value
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey
AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
GROUP BY ps_partkey
HAVING sum(ps_supplycost * ps_availqty) > (
SELECT sum(ps_supplycost * ps_availqty) * 0.0000010000
FROM partsupp, supplier, nation
WHERE ps_suppkey = s_suppkey
AND s_nationkey = n_nationkey
AND n_name = 'GERMANY'
)
ORDER BY value DESC
LIMIT 100;
Compatibilidade de funções
Hologres e ClickHouse compartilham muitas funções básicas com sintaxe idêntica. Para funções diferentes, o Hologres fornece um equivalente nativo ou uma alternativa semanticamente idêntica. Para a lista completa de compatibilidade, consulte Funções compatíveis com ClickHouse.