6 puan yazan GN⁺ 2025-04-24 | 2 yorum | WhatsApp'ta paylaş
  • ClickHouse, yeni bir optimizasyon tekniği olan lazy materialization ile Top N sorgu 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

 
zihado 2025-04-24

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

 
GN⁺ 2025-04-24
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

    • Temel SQL tarifi, örneğe dahil edilecek satırları belirlemek için LIMIT ifadesini kullanıyor
    • Yeni optimizasyon, LIMIT ifadesi veri kümesini az sayıda satıra filtreleyene kadar büyük sütunların okunmasını ertelemeyi vadediyor
    • ClickHouse'ta bu optimizasyonun bu sorguları hızlandırıp hızlandırmadığını doğrulayabilecek biri olup olmadığı merak ediliyor
  • ClickHouse'u gerçekten çok seviyorum

    • Yakın zamanda keşfettim; analiz için verimsiz çözümlerle kıyaslandığında adeta temiz hava gibi geliyor
    • Çok hızlı ve CLI'ını kullanmak da keyifli
  • Kaydırılamayan web sitelerini anlayamıyorum

    • Biraz aşağı kaydırınca yukarı zıplıyor ve kullanılamaz hale geliyor
  • Geç maddeselleştirme, 19 yıl sonra

    • İlgili bağlantı paylaşılmış
  • Yeni maddeselleştirme seçeneğiyle ilgili değil ama şu kısım dikkat çekici

    • Sorgunun 150 milyon değeri sıralayıp ilk 3'ü döndürmesi 70 milisaniye sürüyor
    • Modern donanım ve yazılım karşısında yavaş sorgulara dair zihinsel modeli güncellemek gerekiyor
    • 150 milyon tamsayıyı 70 milisaniyede sıralamak şaşırtıcı değil
    • Tepe bellek kullanımı 3.59 MiB
    • Çok iyi bir makale; net biçimde açıklanmış ve iyi diyagramlar içeriyor
  • ClickHouse'un WSL veya Linux sanal makinesi gerektirmeyen yerel bir Windows sürümü olsaydı, muhtemelen DuckDB'den daha popüler olurdu

    • MySQL'in PostgreSQL'den daha popüler olmasının nedenlerinden biri, MySQL'in bir Windows kurulum programına sahip olmasıydı
  • Havalimanı dramına rağmen sahil tatili planlıyorum

    • Teknik bilgiler ve diyagramlar üst düzeydi, ama hikâye de içerdiği için daha da iyiydi
  • ClickHouse modern mühendisliğin bir başyapıtı

    • Performansa mutlak düzeyde önem veriyor
  • ClickHouse ile StarRocks'u karşılaştıran biri olup olmadığını merak ediyorum

    • Birkaç ay önce StarRocks'un join performansı daha iyi görünüyordu
  • Bu tür veritabanlarının, satır tabanlı tüm veritabanlarının neyi yanlış yaptığını göstermesi şaşırtıcı

    • btree indeks yapısıyla bu hızlara yaklaşmak mümkün değil
    • Modern makinelerin ne kadar hızlı olduğunu görmek şaşırtıcı
    • Veri kümesinin muhtemelen düzgün şekilde sıkıştırılmadığı düşünülüyor
    • Veriyi okumak, sıkıştırmayı açmaktan daha yavaş
    • Cloudflare makalesini hatırlatıyor; şifrelemenin bedava olduğu fikri vardı
    • Hesaplama motoru (chdb) kullanması şaşırtıcı