Hologres, tamamen yönetilen ve PostgreSQL ile uyumlu gerçek zamanlı bir veri ambarıdır. Bu kılavuz, kendi altyapınızda barındırdığınız bir ClickHouse örneğinden şemaları, verileri ve sorguları Hologres'e geçirme sürecini adım adım açıklar.
Önkoşullar
Başlamadan önce aşağıdaki öğelere sahip olduğunuzdan emin olun:
Çalışan bir Hologres örneği. Bkz. Hologres örneği satın alma
ClickHouse istemcisi yüklü bir ClickHouse örneği. İndirme bağlantısı: ClickHouse-Client. Kurulum ayrıntıları için bkz. Başlangıç kılavuzu
Hologres örneğinize bağlı bir psql istemcisi. Bkz. PSQL istemcisi
Arka plan
ClickHouse, çevrimiçi analitik işleme (OLAP) için tasarlanmış sütun tabanlı bir veritabanı yönetim sistemidir (DBMS). Hologres ise bu yeteneği PostgreSQL uyumluluğu, yüksek sorgu başına saniye (QPS) nokta sorguları, tam çoklu tablo JOIN desteği ve maliyet tabanlı bir iyileştirici (CBO) ile genişletir. Aşağıdaki tabloda temel farklılıklar özetlenmiştir.
| Kategori | Kriter | ClickHouse | Hologres |
|---|---|---|---|
| Ürün | Amaç | Ağ trafiği analizi | Genel amaçlı gerçek zamanlı veri ambarı: veri analitiği ve çevrimiçi hizmetler |
| Yazma | Depolama | Sütun deposu | Sütun deposu ve satır deposu |
| Yazma görünürlüğü | Saniye düzeyinde (istemci tarafında toplu işlem gerektirir; dağıtılmış tablo yazmaları parça çoğaltmasının tamamlanmasına bağlıdır) | Milisaniye düzeyinde (uyarlanabilir yazma toplu işlemi; yazmadan hemen sonra sorgulanabilir) | |
| Yazma performansı | Yüksek | Çok yüksek | |
| Ayrıntı depolama | Desteklenir | Desteklenir | |
| Birincil anahtar | Gerçek bir veritabanı birincil anahtarı değildir (benzersizlik kısıtlaması yoktur; yalnızca dizinleme ve toplama için kullanılır) | Benzersizlik kısıtlaması desteğine sahip standart veritabanı birincil anahtarı | |
| Güncellenebilir | Eksik (birincil anahtarlara dayalı yüksek QPS güncellemelerini desteklemez) | Tamamen desteklenir (birincil anahtarlara dayalı yüksek QPS güncellemelerini destekler) | |
| Gerçek zamanlı yazma | Ekleme | Ekleme / yoksa ekle / varsa değiştir / güncelle | |
| Dizin | birincil anahtar, minmax, ngram, token, bloom filtresi | bitmap, sözlük, segment, birincil, kümeleme (otomatik olarak minmax, bloom filtresi ve ngram dizinleri oluşturur) | |
| Sorgu | İyileştirici | Kural tabanlı iyileştirici (RBO) | Maliyet tabanlı iyileştirici (CBO) |
| Birleşik sorgu | Desteklenir (HDFS ve Kafka) | Desteklenir (FDW, MaxCompute ve Hive'ı doğrudan okur) | |
| Ön toplama | Desteklenir (MergeTree aracılığıyla) | Desteklenir (saklı yordamlar ve zamanlanmış işler aracılığıyla) | |
| Yüksek QPS nokta sorgusu | Desteklenmez | Desteklenir; QPS on milyonları aşar | |
| Karmaşık tek tablo sorgusu | İyi | İyi | |
| Çoklu tablo JOIN | Zayıf | İyi | |
| SQL sözdizimi | Özel sözdizimi | PostgreSQL uyumlu | |
| Pencere işlevleri | Desteklenmez | Desteklenir | |
| İşlem | ACID | Yok (nihai tutarlılık; anında sorgulanabilirlik garantisi yok) | Sınırlı (DDL işlemleri, tek satır işlemleri, anlık görüntü tabanlı görünürlük) |
| Olağanüstü durum kurtarma | Yedekleme | ZooKeeper + ClickHouse aracılığıyla çoğaltma | Binlog aracılığıyla mantıksal çoğaltma; altta yatan mekanizmalar aracılığıyla fiziksel çoğaltma |
| Gelişmiş özellikler | Binlog | Yok | Desteklenir |
| Vektör arama | Desteklenir (ClickHouse 22.8+) | Desteklenir | |
| Mekansal veriler | Desteklenmez | Desteklenir | |
| Güvenlik | Özel izinler | IP izin listeleri ve veri maskeleme ile PostgreSQL uyumlu izin modeli | |
| Depolama-işlem ayrımı | Ayrılmamış; tek düğüm kapasitesi ile sınırlı | Ayrılmış; neredeyse sınırsız depolama kapasitesi | |
| Kullanılabilirlik | Manuel yük devretme | Otomatik yük devretme kurtarma | |
| İşletme ve Bakım | Karmaşık (manuel parça dağıtımı) | Tamamen yönetilen | |
| Ekosistem | Veri alımı | Kafka, Flink, Spark | Flink, Spark, JDBC, DataX |
| BI araçları | Sınırlı (Tableau, Superset) | PostgreSQL ekosistemi; 100'den fazla ana akım BI aracını destekler |
Veri türü eşlemesi
ClickHouse ve Hologres farklı tür sistemleri kullanır. Aşağıdaki tablolar, her bir ClickHouse türünü Hologres eşdeğerine eşler ve dönüştürme sırasında dikkat edilmesi gereken tuzakları vurgular.
Sayısal türler
ClickHouse, birden fazla hassasiyette imzalı ve imzasız tamsayı türleri sunar. Hologres ise standart SQL tamsayı hiyerarşisini kullanır. Temel fark: ClickHouse'un yerel bir Boolean türü yoktur; Hologres ise BOOLEAN türünü yerel olarak destekler.
| ClickHouse türü | Hologres türü | Notlar |
|---|---|---|
| Int8 | SMALLINT | Tek baytlık INT desteklenmez; SMALLINT kullanın |
| Int16 | SMALLINT | |
| Int32 | INT | |
| Int64 | BIGINT | |
| UInt8 | INT | |
| UInt16 | INT | |
| UInt32 | BIGINT | |
| UInt64 | BIGINT | Maksimuma yakın UInt64 değerleri (18.446.744.073.709.551.615) BIGINT aralığını aşar; geçişten önce verileri doğrulayın |
| Float32 | FLOAT | |
| Float64 | DOUBLE PRECISION | |
| Decimal(P, S) | DECIMAL | |
| Decimal32(S) | DECIMAL | |
| Decimal64(S) | DECIMAL | |
| Decimal128(S) | DECIMAL | |
| Boolean | BOOLEAN | ClickHouse'un Boolean türü yoktur; boolean değerlerini temsil etmek için ClickHouse'ta UInt8 kullanın |
Dize ve karakter türleri
ClickHouse tüm dize verilerini ham bayt olarak String türüyle depolar. Hologres bunu TEXT türüne eşler. LowCardinality doğrudan bir Hologres eşdeğeri olmayan bir ClickHouse depolama optimizasyonudur — geçişten sonra ilgili sütunlarda sözlük kodlamasını manuel olarak etkinleştirin.
| ClickHouse türü | Hologres türü | Notlar |
|---|---|---|
| String | TEXT | |
| FixString(N) | TEXT | Sabit uzunluklu dizeler değişken uzunluklu hale gelir; Hologres'te sabit uzunluklu dize eşdeğeri yoktur |
| LowCardinality(T) | TEXT (veya altta yatan tür) | Yerel bir tür olarak desteklenmez. Geçişten sonra sözlük kodlamasını manuel olarak etkinleştirin: CALL set_table_property('table', 'dictionary_encoding_columns', 'col'); |
Tarih ve saat türleri
ClickHouse, Date ve çeşitli DateTime varyantlarını kullanır. Hologres, saat dilimi farkındalığı olan tüm türleri TIMESTAMPTZ türüne eşler.
| ClickHouse türü | Hologres türü | Notlar |
|---|---|---|
| Date | Date | |
| DateTime | TIMESTAMPTZ | |
| DateTime(timezone) | TIMESTAMPTZ | |
| DateTime64 | TIMESTAMPTZ |
Karmaşık ve diğer türler
ClickHouse'taki iç içe yapılar (Nested ve Tuple gibi) Hologres'te dizilere düzleştirilir. Binary veriler için kullanım durumunuza göre Hologres türünü seçin.
| ClickHouse türü | Hologres türü | Notlar |
|---|---|---|
| UUID | UUID | |
| Enum | TEXT | Yerel bir tür olarak desteklenmez; bunun yerine TEXT kullanın |
| Nested, Tuple, Array | Array | İç içe türler dizilere düzleştirilir |
| Binary | BIT(n), VARBIT(n), BYTEA, CHAR(n) | Kullanım durumuna göre seçin |
Şemaları geçirin
Şema geçişi, ClickHouse veri tanımlama dili (DDL) ifadelerini Hologres (PostgreSQL uyumlu) DDL'ye dönüştürür. Aşağıdaki adımları tamamlayın.
1. Adım: Tüm veritabanlarını listeleyin
Kaynak örnekteki veritabanlarını listelemek için ClickHouse istemcisinde aşağıdaki komutu çalıştırın.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW databases" > database.list
Sonuçlarda system veritabanı görünür ancak geçirilmesi gerekmez. Bu veritabanını filtreleyin.
| Parametre | Açıklama |
|---|---|
<host> |
Kaynak ClickHouse örneğinin adresi |
<port> |
Kaynak ClickHouse örneğinin bağlantı noktası |
<username> |
DML okuma/yazma, ayarlar ve DDL izinlerine sahip hesap |
<password> |
Hesabın parolası |
2. Adım: Tüm tabloları listeleyin
Belirli bir veritabanındaki tabloları listelemek için ClickHouse istemcisinde aşağıdaki komutu çalıştırın.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW tables from <database_name>" > table.list
.inner. ile başlayan tablolar, materyalleştirilmiş görünümler için kullanılan dahili tablolardır ve geçirilmeleri gerekmez. Bunları filtreleyin.
Tüm veritabanlarını ve tabloları tek seferde listelemek için system.tables meta veri tablosunu sorgulayın:
SELECT DISTINCT database, name FROM system.tables WHERE database != 'system';
3. Adım: Tablo DDL'lerini dışa aktarın
Geçirmek istediğiniz her tablo için DDL'yi dışa aktarın.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SHOW CREATE TABLE <database_name>.<table_name>" > table.sql
Alternatif olarak, dağıtılmamış tüm tablolar için DDL ve meta verileri incelemek amacıyla system.tables tablosunu doğrudan sorgulayabilirsiniz:
SELECT * FROM system.tables
WHERE database = '<database_name>' AND engine != 'Distributed';
Aşağıdaki tabloda, her bir system.tables alanının Hologres kavramlarına nasıl eşlendiği açıklanmaktadır.
| Alan | Eşleme kuralı |
|---|---|
database |
ClickHouse veritabanları, Hologres'teki şemalara eşlenir. CREATE DATABASE "<db>"; ifadesi CREATE SCHEMA "<schema>"; haline gelir |
name |
Tablo adı; değişiklik gerekmez |
engine |
Hologres'te Yerel/Dağıtılmış tablo ayrımı yoktur. engine = 'Distributed' olan satırları filtreleyin |
is_temporary |
Geçici tabloların geçirilmesi gerekmez. Hologres geçici tabloları desteklemez |
data_paths, metadata_path, metadata_modification_time |
Yoksayın |
dependencies_database, dependencies_table |
Bağımlılığı olan görünümler, temel tablolarından önce oluşturulmalıdır. Hologres materyalleştirilmiş görünümleri desteklemez |
create_table_query |
Kaynak DDL; Hologres DDL'ye (PostgreSQL sözdizimi) dönüştürün |
engine_full |
Yoksayın |
partition_key |
Hologres'teki bölümleme anahtarına eşlenir. Eğer partition_key değeri col1 ise, Hologres DDL'ye PARTITION BY LIST (col1) ekleyin |
sorting_key |
Hologres'teki segment anahtarı ve kümeleme anahtarı dizinlerine eşlenir |
primary_key |
Hologres DDL'deki PRIMARY KEY yan tümcesine eşlenir |
sampling_key |
Hologres örnekleme özelliğini desteklemez; yoksayın |
storage_policy |
Yoksayın |
4. Adım: ClickHouse DDL'yi Hologres DDL'ye dönüştürün
Her tablonun DDL'sini dönüştürmek için tür eşlemelerini ve alan dönüştürme kurallarını uygulayın. Aşağıdaki örnekler TPC-H kıyaslama tablolarını kullanır.
Örnek: lineitem tablosu
ClickHouse DDL:
-- 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);
Dönüştürülmüş Hologres DDL:
-- 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;
Örnek: customer tablosu
ClickHouse DDL:
-- 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);
Dönüştürülmüş Hologres DDL:
-- 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;
5. Adım: DDL'yi Hologres'e aktarın
Dönüştürülen DDL'yi hedef Hologres örneğinde yürütmek için psql istemcisinde aşağıdaki komutu çalıştırın.
PGUSER="<username>" PGPASSWORD="<password>" psql \
-h "<host>" -p "<port>" -d "<database_name>" -f table.sql
Verileri geçirin
Üç yöntem mevcuttur. Veri hacminize, gecikme gereksinimlerinize ve mevcut araçlarınıza göre seçim yapın.
| Yöntem | En uygun olduğu durum | Araçlar |
|---|---|---|
| CSV'ye dışa aktarma, ardından COPY (önerilen) | Tek seferlik toplu geçiş; basit kurulum; ek altyapı gerekmez | ClickHouse istemcisi + psql |
| Flink veya Spark işi | Büyük ölçekli geçiş; gerçek zamanlı veya artımlı senkronizasyon; mevcut Flink/Spark altyapısına sahip ekipler | Flink, Spark |
| DataWorks Veri Entegrasyonu veya DataX | Özel kod gerektirmeyen yönetilen geçiş; tam veritabanı çevrimdışı senkronizasyonu | DataWorks, DataX |
Flink ve Spark için bkz. Spark kullanarak veri aktarma. DataWorks Veri Entegrasyonu için bkz. Veri Entegrasyonu ve Tüm bir ClickHouse veritabanını Hologres'e çevrimdışı senkronize etme.
Aşağıdaki adımlar CSV dışa aktarma ve COPY yaklaşımını açıklamaktadır.
1. Adım: ClickHouse'tan verileri CSV'ye dışa aktarın
CSV, basitliği ve geniş araç desteği nedeniyle önerilir. Karmaşık iç içe türlere veya yüksek hassasiyetli ondalık sayılara sahip tablolar için, CSV tür meta verilerini korumadığından yüklemeden önce dışa aktarılan değerleri doğrulayın.
Tablo verilerini yerel bir CSV dosyasına dışa aktarmak için ClickHouse istemcisinde aşağıdaki komutu çalıştırın.
clickhouse-client --host="<host>" --port="<port>" --user="<username>" --password="<password>" \
--query="SELECT * FROM <database_name>.<table_name> FORMAT CSV" > table.csv
| Parametre | Açıklama |
|---|---|
<host> |
Kaynak ClickHouse örneğinin adresi |
<port> |
Kaynak ClickHouse örneğinin bağlantı noktası |
<username> |
DML okuma/yazma, ayarlar ve DDL izinlerine sahip hesap |
<password> |
Hesabın parolası |
<database_name> |
Geçişi yapılacak tabloyu içeren veritabanının adı |
<table_name> |
Geçişi yapılacak tablonun adı |
2. Adım: CSV dosyasını Hologres'e aktarın
CSV dosyasını hedef Hologres tablosuna yüklemek için psql istemcisinde aşağıdaki komutu çalıştırın.
PGUSER="<username>" PGPASSWORD="<password>" psql \
-h "<host>" -p "<port>" -d "<database_name>" \
-c "COPY <schema_name>.<table_name> FROM STDIN (FORMAT 'csv')" < table.csv
| Parametre | Açıklama |
|---|---|
<username> |
Alibaba Cloud hesabınızın AccessKey ID'si. AccessKey Yönetimi sayfasından edinin |
<password> |
Alibaba Cloud hesabınızın AccessKey gizli anahtarı. AccessKey Yönetimi sayfasından edinin |
<host> |
Hologres örneğinin uç noktası. Yönetim Konsolu ndaki örnek ayrıntıları sayfasında Ağ Bilgileri altında bulun |
<port> |
Hologres örneğinin bağlantı noktası. Yönetim Konsolu ndaki Ağ Bilgileri altında bulun |
<database_name> |
Hologres örneğindeki hedef veritabanı adı |
<schema_name> |
Hedef şema adı. Belirtilmezse varsayılan olarak public olur |
<table_name> |
Hologres'teki hedef tablo adı |
3. Adım: Aktarmayı doğrulayın
Verilerin doğru yüklendiğini onaylamak için Hologres'te aktarılan tabloyu sorgulayın.
SELECT COUNT(*) FROM <schema_name>.<table_name>;
Sorguları geçirin
Hologres PostgreSQL sözdizimini kullanırken, ClickHouse kendi SQL lehçesini kullanır. Çoğu ifade uyumludur ancak skaler işlevler, toplama işlevleri ve tanımlayıcı tırnaklama farklılık gösterir.
Sözdizimi farklılıkları
| Alan | ClickHouse | Hologres |
|---|---|---|
| Dize tanımlayıcıları | 'column_name' (tek tırnak) |
"column_name" (çift tırnak) |
| Tablo referansı | SELECT x FROM <database>.<table> |
SELECT x FROM <schema>.<table> |
İşlev eşdeğerleri
Aşağıda listelenmeyen işlevlerin sözdizimi her iki sistemde de aynıdır.
| ClickHouse | Hologres |
|---|---|
toYear(expr) |
to_char(expr, 'YYYY') |
toInt32(expr) |
CAST(expr AS INTEGER) |
uniq(), uniqCombined(), uniqCombined64(), uniqHLL12() |
approx_count_distinct() |
uniqExact() |
count(DISTINCT x) |
quantile(level)(expr) |
approx_percentile(level) WITHIN GROUP (ORDER BY expr) |
quantileExact(level)(expr) |
percentile_cont(level) WITHIN GROUP (ORDER BY expr) |
toDecimal32(val, scale) |
Doğrudan sayısal değişmez kullanın (ör. 0.0000010000) |
Geçiş stratejileri
Normal ifade değiştirmesi — işlev adları, tanımlayıcı tırnaklama ve <database>.<table> referansları gibi sabit kalıpları Hologres eşdeğerleriyle değiştirmek için normal ifadeler kullanın.
ClickHouse Uzantısı — Hologres, toUInt32() gibi bazı ClickHouse işlevlerini dönüştürme gerektirmeden yerel olarak destekleyen bir ClickHouse Uzantısı sağlar. Bkz. ClickHouse uyumlu işlevler.
Sorgu geçiş örnekleri
Aşağıdaki örnekler TPC-H kıyaslama sorgularını kullanır. Her örnek belirli bir geçiş kalıbını vurgular.
Örnek 1: Basit toplama — değişiklik gerekmez
Standart SQL işlevlerini kullanan basit toplamalar için ClickHouse ve Hologres sorguları aynıdır.
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) — değişiklik yok:
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;
Örnek 2: Alt sorguyu yeniden yazma — IN yerine EXISTS
ClickHouse, Hologres'in desteklemediği şekilde çapraz tablo referanslarıyla IN (alt sorgu) kullanımını destekler. Bunun yerine EXISTS kullanarak yeniden yazın.
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 (alt sorgu) ifadesi EXISTS ile değiştirildi:
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;
Örnek 3: İşlev değiştirme — toDecimal32() yerine değişmez değer
ClickHouse'un toDecimal32(value, scale) işlevinin Hologres eşdeğeri yoktur. Bunun yerine düz bir sayısal değişmez değer kullanın.
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) ifadesi 0.0000010000 ile değiştirildi:
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;
İşlev uyumluluğu
Hologres ve ClickHouse, sözdizimi aynı olan birçok temel işlevi paylaşır. Farklılık gösteren işlevler için Hologres ya yerel bir eşdeğer ya da anlamsal olarak aynı olan bir alternatif sunar. Tam uyumluluk listesi için bkz. ClickHouse uyumlu işlevler.