ClickHouse jadi lebih malas dan lebih cepat — menghadirkan optimasi lazy materialization
(clickhouse.com)- ClickHouse memperkenalkan teknik optimasi baru, lazy materialization, untuk meningkatkan performa kueri
Top Nhingga 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
> Penasaran apakah ada yang pernah membandingkan ClickHouse dan StarRocks, beberapa bulan lalu performa join StarRocks tampak lebih baik.
https://d2.naver.com/helloworld/1168674
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
LIMITuntuk menentukan baris yang akan dimasukkan ke dalam sampelLIMITmemfilter kumpulan data menjadi sejumlah kecil barisSangat suka dengan ClickHouse
Tidak paham dengan situs web yang tidak bisa di-scroll
Late materialization, 19 tahun kemudian
Tidak terkait dengan opsi materialization baru, tapi bagian ini menonjol
ClickHouse mungkin akan lebih populer daripada DuckDB jika punya rilis native Windows yang tidak memerlukan WSL atau mesin virtual Linux
Sedang merencanakan liburan pantai meski ada drama bandara
ClickHouse adalah mahakarya rekayasa modern
Penasaran apakah ada yang pernah membandingkan ClickHouse dan StarRocks
Menarik bahwa database seperti ini menunjukkan semua hal yang keliru dari database berbasis baris
chdb)