ClickHouse daha tembel ve daha hızlı hale geliyor - gecikmeli yükleme optimizasyonu tanıtıldı
(clickhouse.com)- ClickHouse, yeni bir optimizasyon tekniği olan lazy materialization ile
Top Nsorgu performansını 1.500 kata kadar artırıyor - Sütun verisini yalnızca gerektiğinde okuma stratejisi ile disk I/O'sunu en aza indiriyor
- Mevcut kolon tabanlı depolama, indeksler ve PREWHERE teknikleriyle birlikte katmanlı bir I/O optimizasyon yığını oluşturuyor
- Sorgu yürütme planına göre sütun verisini gecikmeli yükleyerek, özellikle LIMIT ifadesi içeren sorgularda büyük fayda sağlıyor
- Varsayılan olarak etkin olduğundan, kod değişikliği olmadan performans artışı elde edilebiliyor
ClickHouse'un gecikmeli optimizasyon stratejisi: Lazy Materialization
Temel kavram
- ClickHouse, gereksiz veriyi okumayarak performansı en üst düzeye çıkarır
- lazy materialization, sorgu yürütme sırasında sütun verisinin yalnızca gerçekten gerektiği anda yüklenmesi yaklaşımıdır
- Mevcut I/O optimizasyon teknikleriyle bağımsız çalışırken birbirini tamamlayan performans artışları sağlar
Mevcut I/O optimizasyon teknikleri
- Kolon tabanlı depolama: yalnızca gerekli sütunlar okunur
- Sparse Index / Skipping Index / Projections: filtre koşullarına uyan granule'lar okunur
- PREWHERE: indekslenmemiş sütunlar erken aşamada filtrelenir
- Query Condition Cache: yinelenen sorguların sonucunu önbelleğe alarak aynı granule'ların yeniden işlenmesini önler
Lazy Materialization nasıl çalışır
- Mevcut teknikler filtreleme yoluyla I/O azaltmaya odaklanırken, lazy materialization okumayı hesaplama anına kadar erteler
- Sorgunun bir sonraki aşamasının ihtiyaç duyduğu sütunlar hemen okunur, geri kalanı ise LIMIT sonrasında gerektiğinde okunur
- Özellikle Top N sorgularında yalnızca bazı sütunlar görüntülendiği için, büyük metin sütunları gibi veriler neredeyse hiç okunmaz
> Bu optimizasyon, sütunların bağımsız saklanması sayesinde mümkündür ve satır tabanlı veritabanlarında mümkün olmayan bir yaklaşımdır
Gerçek örnek: Amazon inceleme veri kümesi
-
150M satır, sıkıştırılmamış 70GB, sıkıştırılmış 30GB
-
Top N sorgu örneği:
SELECT helpful_votes FROM amazon.amazon_reviews ORDER BY helpful_votes DESC LIMIT 3;- Çalışma süresi: 0,07 saniye
- Yalnızca ilgili sütun sorgulandığı için yüksek hızda işlenir
-
Büyük metin sütunu sorgulama örneği:
SELECT review_body FROM amazon.amazon_reviews FORMAT Null;- Çalışma süresi: 176 saniye
- Tek sütun olmasına rağmen 56GB boyut nedeniyle disk I/O darboğazı oluşur
Optimizasyon katmanlarına göre performans karşılaştırması
1. Optimizasyon yok (Baseline)
- Çalışma süresi: 219 saniye
- İşlenen veri: 72GB, 150M satır
- Tüm sütunlar okunur ve sıralanır
2. Primary Key Index uygulanmış
- Çalışma süresi: 96 saniye
- İşlenen veri: 28GB, 53M satır
- PK tabanlı granule filtreleme ile sürede %50'den fazla azalma
3. PREWHERE eklenmiş
- Çalışma süresi: 61 saniye
- İşlenen veri: 16GB
- İndekslenmemiş filtre koşulları da uygulanarak I/O daha da azaltılır
4. Lazy Materialization etkin
- Çalışma süresi: 0,18 saniye
- İşlenen veri: 807MB
- Sonuçta gereken yalnızca 3 satır, büyük sütunlardan yüklenir
> Toplamda 1.200 kattan fazla performans artışı, 150 kattan fazla bellek kullanımı azalması
Filtresiz Top N sorgularında da etkili
-
Filtre içermeyen tam sıralama sorgusunda:
SELECT helpful_votes, product_title, review_headline, review_body FROM amazon.amazon_reviews ORDER BY helpful_votes DESC LIMIT 3; -
lazy materialization öncesi: 219 saniye
-
lazy materialization sonrası: 0,139 saniye
-
1.576 kat hız artışı, 40 kat daha az I/O, 300 kat daha az bellek kullanımı
Yürütme planını inceleme
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;
- Sonuç:
Lazily read columns: review_headline, review_body, product_title
Limit
Sorting
ReadFromMergeTree
- Büyük sütunlar yalnızca sıralama ve LIMIT sonrasında yüklenir
Sonuç
- ClickHouse'un I/O optimizasyon yığını tamamlanıyor: Index → PREWHERE → Lazy Materialization
- Kod değiştirmeden, yalnızca sorgu yürütme biçimiyle performans yüzlerce ila binlerce kat artabiliyor
- Özellikle Top N deseni, büyük sütunlar ve LIMIT sorguları için ideal
- Varsayılan olarak etkin olduğundan, kullanıcı ayrıca ayar yapmasa da otomatik uygulanır
> Aynı SQL, aynı makine, farklı sonuç
> Hızlı = daha az okuma = ClickHouse
2 yorum
> ClickHouse ile StarRocks'u karşılaştıran biri var mı merak ediyorum; birkaç ay önce StarRocks'un join performansı daha iyi görünüyordu
https://d2.naver.com/helloworld/1168674
Hacker News yorumları
Bu optimizasyonun, özellikle istenen sütunlarda büyük değerler bulunabildiğinde, büyük veri kümelerinden rastgele örnekler çıkarırken dramatik hız artışları sağlayacağı düşünülüyor
LIMITifadesini kullanıyorLIMITifadesi veri kümesini az sayıda satıra filtreleyene kadar büyük sütunların okunmasını ertelemeyi vadediyorClickHouse'u gerçekten çok seviyorum
Kaydırılamayan web sitelerini anlayamıyorum
Geç maddeselleştirme, 19 yıl sonra
Yeni maddeselleştirme seçeneğiyle ilgili değil ama şu kısım dikkat çekici
ClickHouse'un WSL veya Linux sanal makinesi gerektirmeyen yerel bir Windows sürümü olsaydı, muhtemelen DuckDB'den daha popüler olurdu
Havalimanı dramına rağmen sahil tatili planlıyorum
ClickHouse modern mühendisliğin bir başyapıtı
ClickHouse ile StarRocks'u karşılaştıran biri olup olmadığını merak ediyorum
Bu tür veritabanlarının, satır tabanlı tüm veritabanlarının neyi yanlış yaptığını göstermesi şaşırtıcı
btreeindeks yapısıyla bu hızlara yaklaşmak mümkün değilchdb) kullanması şaşırtıcı