Optimasi Query di ClickHouse: Tips dan Trik untuk Performa Maksimal

Published 24/10/25 · Read 4 minute

Setelah ClickHouse terpasang dan berjalan dengan baik, langkah selanjutnya adalah memastikan query Anda berjalan secepat mungkin.
ClickHouse memang cepat secara default, tetapi dengan konfigurasi dan teknik optimasi yang tepat, performanya bisa meningkat berkali-kali lipat — bahkan untuk dataset berukuran terabyte hingga petabyte.

Berikut panduan praktis untuk mengoptimalkan query dan struktur data di ClickHouse agar Anda mendapatkan performa maksimal.


1. Gunakan Engine yang Tepat

ClickHouse memiliki beberapa engine tabel. Engine utama dan paling umum adalah MergeTree, yang mendukung indeks, partisi, dan penyortiran data.

Gunakan variasi MergeTree sesuai kebutuhan:

Engine Kegunaan
MergeTree Engine dasar untuk tabel analitik umum.
ReplacingMergeTree Menyimpan versi terbaru data (berguna untuk update ringan).
SummingMergeTree Mengagregasi nilai numerik secara otomatis saat merge.
AggregatingMergeTree Menyimpan hasil agregasi untuk mempercepat query berat.
CollapsingMergeTree Untuk data dengan event insert/delete.
ReplicatedMergeTree Untuk kluster dengan replikasi otomatis.

Contoh:

CREATE TABLE sales
(
    date Date,
    region String,
    product String,
    revenue Float64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (region, product);

Tips:
Tentukan ORDER BY berdasarkan kolom yang sering digunakan untuk filter (WHERE) atau agregasi (GROUP BY).


2. Gunakan Partisi dengan Bijak

Partisi membantu ClickHouse membaca sebagian data saja, bukan seluruh tabel.
Idealnya, partisi dibuat berdasarkan waktu atau kategori data yang sering digunakan.

Contoh partisi berdasarkan bulan:

PARTITION BY toYYYYMM(date)

Keuntungan partisi:

  • Query lebih cepat karena hanya membaca blok data tertentu.

  • Lebih mudah melakukan manajemen data (drop/merge).

  • Meningkatkan efisiensi penyimpanan dan penghapusan data lama.

Hindari: Membuat terlalu banyak partisi kecil (mis. satu per hari untuk dataset sangat besar). Gunakan partisi bulanan atau mingguan agar tetap efisien.


3. Batasi Kolom yang Dibaca

ClickHouse membaca hanya kolom yang disebutkan dalam query.
Maka, hindari SELECT * karena akan memuat seluruh kolom dan memperlambat query.

READ :  ClickHouse 100x Lebih Cepat dari MySQL untuk Pencarian Big Data

Contoh yang efisien:

SELECT region, sum(revenue)
FROM sales
WHERE date >= '2025-10-01'
GROUP BY region;

4. Gunakan PREWHERE untuk Filter Lebih Cepat

PREWHERE memfilter data sebelum kolom lain dibaca dari disk.
Ini mempercepat query pada tabel besar.

Contoh:

SELECT product, sum(revenue)
FROM sales
PREWHERE date >= '2025-10-01' AND region = 'Asia'
GROUP BY product;

ClickHouse kadang otomatis memindahkan kondisi WHERE menjadi PREWHERE, tapi Anda juga bisa menentukannya manual untuk kontrol penuh.


5. Manfaatkan Materialized Views

Jika Anda sering menjalankan query agregasi yang sama, buat Materialized View untuk menyimpan hasilnya secara otomatis.

Contoh:

CREATE MATERIALIZED VIEW daily_sales
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (region)
AS
SELECT region, toDate(date) AS date, sum(revenue) AS total
FROM sales
GROUP BY region, date;

Hasil view ini otomatis diperbarui setiap kali ada data baru, sehingga query agregasi menjadi instan.


6. Kompresi dan Encoding

ClickHouse mendukung berbagai metode kompresi (LZ4, ZSTD, Deflate).
Gunakan ZSTD untuk kompresi terbaik antara kecepatan dan efisiensi.

Contoh konfigurasi di kolom:

CREATE TABLE metrics
(
    id UInt32 CODEC(ZSTD),
    value Float64 CODEC(LZ4)
)
ENGINE = MergeTree()
ORDER BY id;

Kompresi yang tepat bisa mengurangi ukuran data hingga 5–10 kali lipat tanpa penurunan performa baca yang signifikan.


7. Gunakan Index Sekunder (Data Skipping Index)

ClickHouse tidak menggunakan indeks seperti database tradisional, tapi mendukung Data Skipping Index untuk mempercepat pencarian pada kolom tertentu.

Contoh:

CREATE TABLE logs
(
    event_time DateTime,
    level String,
    message String,
    INDEX idx_level level TYPE set(0) GRANULARITY 8192
)
ENGINE = MergeTree()
ORDER BY event_time;

Dengan index ini, ClickHouse dapat melewati blok data yang tidak relevan dengan filter query Anda.


8. Optimalkan Konfigurasi Server

Beberapa parameter konfigurasi di config.xml dapat mempercepat kinerja:

Parameter Fungsi Rekomendasi
max_threads Jumlah thread per query Set ke jumlah CPU logical core
max_memory_usage Batas memori per query 50–70% dari total RAM
max_bytes_before_external_group_by Batas sebelum spill ke disk Sesuaikan dengan RAM besar
max_parallel_replicas Query paralel antar node Aktifkan untuk cluster
READ :  Cara Install PHPMyadmin VPS Linux (Terminal)

Setelah mengubah konfigurasi, restart layanan ClickHouse agar pengaturan berlaku.


9. Gunakan Profiling untuk Menganalisis Query

Gunakan fitur EXPLAIN dan tabel sistem untuk melihat performa query.

Contoh:

EXPLAIN PIPELINE SELECT region, sum(revenue) FROM sales GROUP BY region;

Atau lihat histori eksekusi:

SELECT query, read_rows, memory_usage, query_duration_ms
FROM system.query_log
ORDER BY event_time DESC
LIMIT 10;

Gunakan hasil ini untuk menemukan query yang paling berat dan memperbaikinya.


10. Distribusi Data di Kluster

Untuk skala besar, ClickHouse dapat dijalankan dalam mode kluster dengan replikasi dan sharding.

  • Sharding: membagi data berdasarkan logika tertentu (mis. region atau waktu).

  • Replikasi: menduplikasi data antar node untuk ketahanan dan ketersediaan tinggi.

  • Distributed Engine: memungkinkan query berjalan di seluruh node secara paralel.

Contoh penggunaan:

CREATE TABLE sales_all AS sales
ENGINE = Distributed(cluster_name, db_name, sales, rand());

Kesimpulan

Optimasi di ClickHouse bukan hanya soal query cepat, tapi tentang desain tabel, strategi partisi, dan konfigurasi sistem yang tepat.
Dengan mengikuti prinsip di atas, Anda bisa mencapai performa luar biasa bahkan di dataset berskala miliaran baris.

Ringkasan Kunci:

  • Gunakan MergeTree dan partisi yang efisien.

  • Hindari SELECT *, gunakan PREWHERE.

  • Manfaatkan materialized view dan index skipping.

  • Pantau performa lewat system.query_log.

  • Optimalkan konfigurasi server sesuai kapasitas perangkat keras.