6 poin oleh GN⁺ 2025-04-24 | 2 komentar | Bagikan ke WhatsApp
  • ClickHouse memperkenalkan teknik optimasi baru, lazy materialization, untuk meningkatkan performa kueri Top N hingga 1.500x
  • Strategi membaca data kolom hanya saat dibutuhkan meminimalkan disk I/O
  • Bersama teknik yang sudah ada seperti penyimpanan kolumnar, indeks, dan PREWHERE, ini membentuk stack optimasi I/O berlapis
  • Dengan menunda pemuatan data kolom sesuai rencana eksekusi kueri, dampaknya sangat besar terutama pada kueri dengan klausa LIMIT
  • Karena aktif secara default, peningkatan performa bisa diperoleh tanpa perubahan kode

Strategi optimasi tertunda ClickHouse: Lazy Materialization

Konsep inti

  • ClickHouse memaksimalkan performa dengan tidak membaca data yang tidak perlu
  • lazy materialization adalah pendekatan yang memuat data kolom hanya pada saat benar-benar dibutuhkan selama eksekusi kueri
  • Teknik ini bekerja secara independen dari teknik optimasi I/O yang sudah ada, sekaligus memberi peningkatan performa yang saling melengkapi

Teknologi optimasi I/O yang sudah ada

  • Penyimpanan berbasis kolom: hanya membaca kolom yang diperlukan
  • Sparse Index / Skipping Index / Projections: hanya membaca granule yang sesuai dengan kondisi filter
  • PREWHERE: memfilter lebih awal pada kolom non-indeks
  • Query Condition Cache: menyimpan hasil kueri berulang dalam cache untuk menghindari pemrosesan ulang granule yang sama

Cara kerja Lazy Materialization

  • Jika teknik sebelumnya berfokus pada pengurangan I/O melalui filtering, lazy materialization menunda pembacaan hingga saat komputasi benar-benar memerlukannya
  • Hanya kolom yang dibutuhkan oleh tahap kueri berikutnya yang langsung dibaca, sementara sisanya dibaca setelah LIMIT jika memang diperlukan
  • Terutama pada kueri Top N, karena hanya sebagian kolom yang dipakai, kolom teks berukuran besar dan sejenisnya hampir tidak perlu dibaca

> Optimasi ini dimungkinkan karena penyimpanan kolom yang independen, dan merupakan pendekatan yang tidak mungkin dilakukan pada DB berbasis baris


Contoh nyata: dataset ulasan Amazon

  • 150M rows, 70GB tidak terkompresi, 30GB terkompresi

  • Contoh kueri Top N:

    SELECT helpful_votes  
    FROM amazon.amazon_reviews  
    ORDER BY helpful_votes DESC  
    LIMIT 3;  
    
    • Waktu eksekusi: 0,07 detik
    • Pemrosesan cepat karena hanya membaca satu kolom
  • Contoh pembacaan kolom teks berukuran besar:

    SELECT review_body  
    FROM amazon.amazon_reviews  
    FORMAT Null;  
    
    • Waktu eksekusi: 176 detik
    • Meski hanya satu kolom, ukurannya 56GB sehingga bottleneck terjadi pada disk I/O

Perbandingan performa menurut lapisan optimasi yang diterapkan

1. Tanpa optimasi (Baseline)

  • Waktu eksekusi: 219 detik
  • Throughput: 72GB, 150M rows
  • Membaca dan mengurutkan semua kolom secara penuh

2. Primary Key Index diterapkan

  • Waktu eksekusi: 96 detik
  • Throughput: 28GB, 53M rows
  • Filtering granule berbasis PK memangkas waktu lebih dari 50%

3. PREWHERE ditambahkan

  • Waktu eksekusi: 61 detik
  • Throughput: 16GB
  • Kondisi filter non-indeks juga diterapkan untuk menurunkan I/O lebih lanjut

4. Lazy Materialization diaktifkan

  • Waktu eksekusi: 0,18 detik
  • Throughput: 807MB
  • Pada akhirnya hanya 3 row yang benar-benar diperlukan yang dimuat dari kolom besar

> Total peningkatan performa lebih dari 1.200x, dan penggunaan memori berkurang lebih dari 150x


Tetap efektif untuk kueri Top N tanpa filter

  • Pada kueri pengurutan penuh tanpa filter:

    SELECT helpful_votes, product_title, review_headline, review_body  
    FROM amazon.amazon_reviews  
    ORDER BY helpful_votes DESC  
    LIMIT 3;  
    
  • Sebelum lazy materialization: 219 detik

  • Setelah lazy materialization: 0,139 detik

  • Percepatan 1.576x, I/O berkurang 40x, penggunaan memori berkurang 300x


Memeriksa execution plan

EXPLAIN actions = 1  
SELECT helpful_votes, product_title, review_headline, review_body  
FROM amazon.amazon_reviews  
ORDER BY helpful_votes DESC  
LIMIT 3  
SETTINGS query_plan_optimize_lazy_materialization = true;  
  • Hasil:
Lazily read columns: review_headline, review_body, product_title   
  Limit                    
    Sorting                             
      ReadFromMergeTree  
  • Kolom berukuran besar dimuat hanya setelah sorting dan LIMIT

Kesimpulan

  • Stack optimasi I/O ClickHouse kini lengkap: Index → PREWHERE → Lazy Materialization
  • Tanpa perubahan kode, performa bisa meningkat ratusan hingga ribuan kali hanya lewat cara eksekusi kueri
  • Sangat ideal terutama untuk pola Top N, kolom berukuran besar, dan kueri LIMIT
  • Karena aktif secara default, pengguna tidak perlu melakukan konfigurasi terpisah agar ini diterapkan otomatis

> SQL yang sama, mesin yang sama, hasil yang berbeda
> cepat = membaca lebih sedikit = ClickHouse

2 komentar

 
zihado 2025-04-24

> Penasaran apakah ada yang pernah membandingkan ClickHouse dan StarRocks, beberapa bulan lalu performa join StarRocks tampak lebih baik.
https://d2.naver.com/helloworld/1168674

 
GN⁺ 2025-04-24
Komentar Hacker News
  • Optimisasi ini akan memberikan peningkatan kecepatan yang dramatis terutama saat mengambil sampel acak dari kumpulan data besar, khususnya bila kolom yang diinginkan dapat berisi nilai besar

    • Resep SQL dasarnya menggunakan klausa LIMIT untuk menentukan baris yang akan dimasukkan ke dalam sampel
    • Optimisasi baru ini menjanjikan penundaan pembacaan kolom besar sampai klausa LIMIT memfilter kumpulan data menjadi sejumlah kecil baris
    • Penasaran apakah ada yang bisa memverifikasi apakah optimisasi ini memang mempercepat kueri semacam ini di ClickHouse
  • Sangat suka dengan ClickHouse

    • Baru menemukannya belakangan ini, dan rasanya seperti angin segar dibanding solusi yang tidak efisien untuk analitik
    • Sangat cepat dan CLI-nya juga menyenangkan untuk digunakan
  • Tidak paham dengan situs web yang tidak bisa di-scroll

    • Sedikit scroll lalu melompat kembali ke atas sehingga tidak bisa digunakan
  • Late materialization, 19 tahun kemudian

    • Menyertakan tautan terkait
  • Tidak terkait dengan opsi materialization baru, tapi bagian ini menonjol

    • Kueri yang mengurutkan 150 juta nilai dan mengembalikan 3 teratas membutuhkan 70 milidetik
    • Perlu memperbarui model mental tentang kueri lambat di perangkat keras dan perangkat lunak modern
    • Mengurutkan 150 juta bilangan bulat dalam 70 milidetik bukan hal yang mengejutkan
    • Penggunaan memori puncaknya 3.59 MiB
    • Artikelnya sangat bagus, dijelaskan dengan jelas dan disertai diagram yang bagus
  • ClickHouse mungkin akan lebih populer daripada DuckDB jika punya rilis native Windows yang tidak memerlukan WSL atau mesin virtual Linux

    • Salah satu alasan MySQL lebih populer daripada PostgreSQL adalah karena MySQL memiliki installer Windows
  • Sedang merencanakan liburan pantai meski ada drama bandara

    • Informasi teknis dan diagramnya kelas atas, tapi kehadiran cerita membuatnya jadi lebih baik lagi
  • ClickHouse adalah mahakarya rekayasa modern

    • Perhatian terhadap performa benar-benar total
  • Penasaran apakah ada yang pernah membandingkan ClickHouse dan StarRocks

    • Beberapa bulan lalu performa join StarRocks tampak lebih baik
  • Menarik bahwa database seperti ini menunjukkan semua hal yang keliru dari database berbasis baris

    • Dengan struktur indeks btree, mustahil mendekati kecepatan seperti ini
    • Mengejutkan melihat seberapa cepat mesin modern
    • Rasanya kumpulan datanya bahkan belum dikompresi dengan benar
    • Membaca data lebih lambat daripada mendekompresinya
    • Mengingatkan pada artikel Cloudflare, tentang gagasan bahwa enkripsi itu gratis
    • Menarik bahwa yang digunakan adalah mesin komputasi (chdb)