Hologres es un almacén de datos en tiempo real totalmente gestionado y compatible con PostgreSQL. Esta guía le explica cómo migrar esquemas, datos y consultas desde una instancia de ClickHouse autogestionada hacia Hologres.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de Hologres en ejecución. Consulte Purchase a Hologres instance
Una instancia de ClickHouse con el cliente de ClickHouse instalado. Descargue: ClickHouse-Client. Para más detalles sobre la instalación, consulte Primeros pasos
Un cliente psql conectado a su instancia de Hologres. Consulte PSQL client
Contexto
ClickHouse es un sistema de gestión de bases de datos (DBMS) orientado por columnas, diseñado para el procesamiento analítico en línea (OLAP). Hologres amplía esta capacidad con compatibilidad con PostgreSQL, consultas puntuales de alto rendimiento (QPS), soporte completo para JOIN entre varias tablas y un optimizador basado en costos (CBO). La siguiente tabla resume las diferencias principales.
|
Categoría |
Criterio |
ClickHouse |
Hologres |
|
Producto |
Propósito |
Análisis de tráfico de red |
Almacén de datos en tiempo real de propósito general: análisis de datos y servicios en línea |
|
Escritura |
Almacenamiento |
Almacenamiento por columnas |
Almacenamiento por columnas y por filas |
|
Visibilidad de escritura |
Nivel de segundos (requiere agrupación por lotes del lado del cliente; las escrituras en tablas distribuidas dependen de que termine la replicación de los fragmentos) |
Nivel de milisegundos (agrupación adaptativa de escrituras; consultable de inmediato tras escribir) |
|
|
Rendimiento de escritura |
Alto |
Muy alto |
|
|
Almacenamiento detallado |
Compatible |
Compatible |
|
|
Clave primaria |
No es una clave primaria de base de datos real (sin restricción de unicidad; solo sirve para indexación y agregación) |
Clave primaria estándar de base de datos con soporte para restricción de unicidad |
|
|
Actualizable |
Incompleto (no admite actualizaciones de alto QPS basadas en claves primarias) |
Totalmente compatible (admite actualizaciones de alto QPS basadas en claves primarias) |
|
|
Escritura en tiempo real |
Append |
Append / insert or ignore / insert or replace / update |
|
|
Índice |
primary key, minmax, ngram, token, bloom filter |
bitmap, dictionary, segment, primary, clustering (crea automáticamente índices minmax, bloom filter y ngram) |
|
|
Consulta |
Optimizador |
Optimizador basado en reglas (RBO) |
Optimizador basado en costos (CBO) |
|
Consulta federada |
Compatible (HDFS y Kafka) |
Compatible (FDW lee MaxCompute y Hive directamente) |
|
|
Preagregación |
Compatible (mediante MergeTree) |
Compatible (mediante procedimientos almacenados y trabajos programados) |
|
|
Consulta puntual de alto QPS |
No compatible |
Compatible; el QPS supera las decenas de millones |
|
|
Consulta compleja de una sola tabla |
Bueno |
Bueno |
|
|
JOIN de varias tablas |
Deficiente |
Bueno |
|
|
Sintaxis SQL |
Sintaxis propia |
Compatible con PostgreSQL |
|
|
Funciones de ventana |
No compatible |
Compatible |
|
|
Transacción |
ACID |
No (consistencia eventual; sin garantía de consulta inmediata) |
Limitado (transacciones DDL, transacciones de una sola fila, visibilidad basada en instantáneas) |
|
Recuperación ante desastres |
Copia de seguridad |
Replicación mediante ZooKeeper + ClickHouse |
Replicación lógica mediante Binlog; replicación física mediante mecanismos subyacentes |
|
Funciones avanzadas |
Binlog |
Ninguna |
Compatible |
|
Búsqueda vectorial |
Compatible (ClickHouse 22.8+) |
Compatible |
|
|
Datos espaciales |
No compatible |
Compatible |
|
|
Seguridad |
Permisos personalizados |
Modelo de permisos compatible con PostgreSQL con listas blancas de IP y enmascaramiento de datos |
|
|
Separación de almacenamiento y cómputo |
Sin separación; limitado por la capacidad de un solo nodo |
Separado; capacidad de almacenamiento casi ilimitada |
|
|
Disponibilidad |
Conmutación por error manual |
Recuperación automática tras conmutación por error |
|
|
Operación y mantenimiento |
Complejo (distribución manual de fragmentos) |
Totalmente gestionado |
|
|
Ecosistema |
Ingesta de datos |
Kafka, Flink, Spark |
Flink, Spark, JDBC, DataX |
|
Herramientas de BI |
Limitado (Tableau, Superset) |
Ecosistema de PostgreSQL; compatible con más de 100 herramientas de BI principales |
Mapeo de tipos de datos
ClickHouse y Hologres utilizan sistemas de tipos distintos. Las siguientes tablas relacionan cada tipo de ClickHouse con su equivalente en Hologres y señalan los puntos críticos durante la conversión.
Tipos numéricos
ClickHouse ofrece tipos enteros con y sin signo en diversas precisiones. Hologres utiliza la jerarquía estándar de enteros de SQL. Una diferencia importante: ClickHouse no tiene un tipo Boolean nativo, mientras que Hologres sí admite BOOLEAN de forma nativa.
|
Tipo de ClickHouse |
Tipo de Hologres |
Notas |
|
Int8 |
SMALLINT |
No se admite INT de un solo byte; use SMALLINT |
|
Int16 |
SMALLINT |
|
|
Int32 |
INT |
|
|
Int64 |
BIGINT |
|
|
UInt8 |
INT |
|
|
UInt16 |
INT |
|
|
UInt32 |
BIGINT |
|
|
UInt64 |
BIGINT |
Los valores de UInt64 cercanos al máximo (18,446,744,073,709,551,615) superan el rango de BIGINT; valide los datos antes de migrar |
|
Float32 |
FLOAT |
|
|
Float64 |
DOUBLE PRECISION |
|
|
Decimal(P, S) |
DECIMAL |
|
|
Decimal32(S) |
DECIMAL |
|
|
Decimal64(S) |
DECIMAL |
|
|
Decimal128(S) |
DECIMAL |
|
|
Boolean |
BOOLEAN |
ClickHouse no tiene tipo Boolean; use UInt8 en ClickHouse para representar valores booleanos |
Tipos de cadena y caracteres
ClickHouse almacena todos los datos de cadena como bytes sin procesar mediante el tipo String. Hologres lo asigna a TEXT. LowCardinality es una optimización de almacenamiento de ClickHouse sin equivalente directo en Hologres. Tras la migración, habilite manualmente la codificación de diccionario en las columnas correspondientes.
|
Tipo de ClickHouse |
Tipo de Hologres |
Notas |
|
String |
TEXT |
|
|
FixString(N) |
TEXT |
Las cadenas de longitud fija pasan a ser de longitud variable; Hologres no tiene un equivalente de cadena de longitud fija |
|
LowCardinality(T) |
TEXT (o el tipo subyacente) |
No se admite como tipo nativo. Tras la migración, habilite manualmente la codificación de diccionario: |
Tipos de fecha y hora
ClickHouse usa Date y distintas variantes de DateTime. Hologres asigna todos los tipos con zona horaria a TIMESTAMPTZ.
|
Tipo de ClickHouse |
Tipo de Hologres |
Notas |
|
Date |
Date |
|
|
DateTime |
TIMESTAMPTZ |
|
|
DateTime(timezone) |
TIMESTAMPTZ |
|
|
DateTime64 |
TIMESTAMPTZ |
Tipos complejos y otros tipos
Las estructuras anidadas de ClickHouse (como Nested y Tuple) se aplanan en arreglos dentro de Hologres. Para los datos binarios, elija el tipo de Hologres según su caso de uso.
|
Tipo de ClickHouse |
Tipo de Hologres |
Notas |
|
UUID |
UUID |
|
|
Enum |
TEXT |
No se admite como tipo nativo; use TEXT en su lugar |
|
Nested, Tuple, Array |
Array |
Los tipos anidados se aplanan en arreglos |
|
Binary |
BIT(n), VARBIT(n), BYTEA, CHAR(n) |
Elija según el caso de uso |
Migrar esquemas
La migración de esquemas convierte las instrucciones de lenguaje de definición de datos (DDL) de ClickHouse a DDL de Hologres (compatible con PostgreSQL). Complete los siguientes pasos.
Paso 1: Listar todas las bases de datos
Ejecute el siguiente comando en el cliente de ClickHouse para listar las bases de datos de la instancia de origen.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW databases" > database.list
La base de datos system aparece en los resultados, pero no es necesario migrarla. Fíltrela.
|
Parámetro |
Descripción |
|
|
Dirección de la instancia de ClickHouse de origen |
|
|
Puerto de la instancia de ClickHouse de origen |
|
|
Cuenta con permisos de lectura y escritura DML, configuración y DDL |
|
|
Contraseña de la cuenta |
Paso 2: Listar todas las tablas
Ejecute el siguiente comando en el cliente de ClickHouse para listar las tablas de una base de datos específica.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW tables from <database_name>" > table.list
Las tablas que comienzan con .inner. son tablas internas de vistas materializadas y no requieren migración. Fíltrelas.
Para listar todas las bases de datos y tablas a la vez, consulte la tabla de metadatos system.tables:
SELECT DISTINCT database, name FROM system.tables WHERE database != 'system';
Paso 3: Exportar el DDL de las tablas
Exporte el DDL de cada tabla que desee migrar.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW CREATE TABLE <database_name>.<table_name>" > table.sql
También puede consultar system.tables directamente para revisar el DDL y los metadatos de todas las tablas no distribuidas:
SELECT * FROM system.tables
WHERE database = '<database_name>' AND engine != 'Distributed';
La siguiente tabla explica cómo se relaciona cada campo de system.tables con los conceptos de Hologres.
|
Campo |
Regla de mapeo |
|
|
Las bases de datos de ClickHouse se asignan a esquemas en Hologres. |
|
|
Nombre de la tabla; no requiere cambios |
|
|
Hologres no distingue entre tablas locales y distribuidas. Filtre las filas donde |
|
|
No es necesario migrar las tablas temporales. Hologres no las admite |
|
|
Ignorar |
|
|
Las vistas con dependencias deben crearse antes que sus tablas base. Hologres no admite vistas materializadas |
|
|
DDL de origen; conviértalo a DDL de Hologres (sintaxis de PostgreSQL) |
|
|
Ignorar |
|
|
Se asigna a la clave de partición en Hologres. Si |
|
|
Se asigna a los índices de clave de segmento y clave de agrupación en Hologres |
|
|
Se asigna a la cláusula |
|
|
Hologres no admite muestreo; ignorar |
|
|
Ignorar |
Paso 4: Convertir el DDL de ClickHouse a DDL de Hologres
Aplique los mapeos de tipos y las reglas de conversión de campos para transformar el DDL de cada tabla. Los siguientes ejemplos usan tablas de referencia TPC-H.
Ejemplo: tabla lineitem
DDL de 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;
Ejemplo: tabla customer
DDL de 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;
Paso 5: Importar el DDL a Hologres
Ejecute el siguiente comando en el cliente psql para aplicar el DDL convertido en la instancia de Hologres de destino.
PGUSER="<username>" PGPASSWORD="<password>" psql \
-h "<host>" -p "<port>" -d "<database_name>" -f table.sql
Migrar datos
Existen tres métodos disponibles. Elija uno según el volumen de datos, los requisitos de latencia y las herramientas con las que ya cuente.
|
Método |
Recomendado para |
Herramientas |
|
Exportar a CSV y luego usar COPY (recomendado) |
Migraciones por lotes únicas; configuración sencilla; no requiere infraestructura adicional |
Cliente de ClickHouse + psql |
|
Trabajo de Flink o Spark |
Migraciones a gran escala; sincronización en tiempo real o incremental; equipos con infraestructura existente de Flink o Spark |
Flink, Spark |
|
Data Integration de DataWorks o DataX |
Migraciones gestionadas sin código personalizado; sincronización sin conexión de bases de datos completas |
DataWorks, DataX |
Para Flink y Spark, consulte Import data using Spark. Para Data Integration de DataWorks, consulte Data Integration y Synchronize an entire ClickHouse database to Hologres offline.
A continuación se describen los pasos del método de exportación a CSV e importación con COPY.
Paso 1: Exportar datos de ClickHouse a CSV
Se recomienda CSV por su sencillez y su amplia compatibilidad con diversas herramientas. En tablas con tipos anidados complejos o decimales de alta precisión, valide los valores exportados antes de cargarlos, ya que CSV no conserva los metadatos de tipo.
Ejecute el siguiente comando en el cliente de ClickHouse para exportar los datos de la tabla a un archivo 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 |
Descripción |
|
|
Dirección de la instancia de ClickHouse de origen |
|
|
Puerto de la instancia de ClickHouse de origen |
|
|
Cuenta con permisos de lectura y escritura DML, configuración y DDL |
|
|
Contraseña de la cuenta |
|
|
Nombre de la base de datos que contiene la tabla por migrar |
|
|
Nombre de la tabla por migrar |
Paso 2: Importar el archivo CSV a Hologres
Ejecute el siguiente comando en el cliente psql para cargar el archivo CSV en la tabla de 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 |
Descripción |
|
|
AccessKey ID de su cuenta de Alibaba Cloud. Obténgalo en AccessKey Management |
|
|
AccessKey secret de su cuenta de Alibaba Cloud. Obténgalo en AccessKey Management |
|
|
Endpoint de la instancia de Hologres. Encuéntrelo en la página de detalles de la instancia, dentro de Network Information, en la Management Console |
|
|
Puerto de la instancia de Hologres. Encuéntrelo en Network Information dentro de la Management Console |
|
|
Nombre de la base de datos de destino en la instancia de Hologres |
|
|
Nombre del esquema de destino. Si no se especifica, toma el valor predeterminado |
|
|
Nombre de la tabla de destino en Hologres |
Paso 3: Comprobar la importación
Consulte la tabla importada en Hologres para comprobar que los datos se cargaron correctamente.
SELECT COUNT(*) FROM <schema_name>.<table_name>;
Migrar consultas
Hologres utiliza la sintaxis de PostgreSQL, mientras que ClickHouse emplea su propio dialecto de SQL. La mayoría de las instrucciones son compatibles, pero difieren en las funciones escalares, las funciones de agregación y el uso de comillas en los identificadores.
Diferencias de sintaxis
|
Área |
ClickHouse |
Hologres |
|
Identificadores de cadena |
|
|
|
Referencia de tabla |
|
|
Equivalencias de funciones
Las funciones que no aparecen en la siguiente lista tienen la misma sintaxis en ambos sistemas.
|
ClickHouse |
Hologres |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Use un literal numérico directamente (por ejemplo, |
Estrategias de migración
Reemplazo con expresiones regulares: utilice expresiones regulares para sustituir patrones fijos, como nombres de funciones, comillas en identificadores y referencias <database>.<table>, por sus equivalentes en Hologres.
ClickHouse Extension: Hologres incluye una extensión de ClickHouse que admite de forma nativa algunas funciones de este sistema, como toUInt32(), sin necesidad de convertirlas. Consulte ClickHouse-compatible functions.
Ejemplos de migración de consultas
Los siguientes ejemplos utilizan consultas de referencia TPC-H. Cada uno ilustra un patrón específico de migración.
Ejemplo 1: Agregación simple, sin cambios necesarios
En agregaciones directas con funciones SQL estándar, las consultas de ClickHouse y Hologres son 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), sin cambios:
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;
Ejemplo 2: Reescritura de subconsulta, de IN a EXISTS
ClickHouse admite IN (subquery) con referencias cruzadas entre tablas de una manera que Hologres no permite. Reescriba la consulta con 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), con IN (subquery) reemplazado 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;
Ejemplo 3: Sustitución de función, de toDecimal32() a un literal
La función toDecimal32(value, scale) de ClickHouse no tiene equivalente en Hologres. Sustitúyala por un literal numérico simple.
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), con toDecimal32(0.0000010000, 9) reemplazado 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;
Compatibilidad de funciones
Hologres y ClickHouse comparten muchas funciones básicas con sintaxis idéntica. Cuando existen diferencias, Hologres ofrece un equivalente nativo o una alternativa semánticamente igual. Para consultar la lista completa de compatibilidad, vea ClickHouse-compatible functions.