ClickHouse'ta neredeyse aynı görünen sorguların performansında büyük farklılıklar yaşanması, geliştiricilerin dikkatini çeken önemli bir sorundu. Bu durum, özellikle GROUP BY anahtarının veri tipinin (örneğin, UInt16 yerine UInt64 olarak yorumlanması) sorgu planını ve dolayısıyla performansını ciddi şekilde etkilemesinden kaynaklanıyordu. Makale, bu performans tutarsızlığının temelinde yatan ClickHouse toplama (aggregation) mekanizmalarını derinlemesine inceliyor ve çözüm önerilerini sunuyor.
ClickHouse'taki toplama işlemleri, GROUP BY anahtarının boyutuna göre farklı hash map yapıları kullanır. Eğer anahtar UInt16'dan küçük bir sayı ise, sabit boyutlu bir dizi (fixed hash map) kullanılır. Daha büyük anahtarlar için ise standart hash map'ler veya potansiyel olarak iki seviyeli hash map'ler devreye girer. Sorun, toplama durumlarının birleştirilmesi aşamasında ortaya çıkıyor. İki seviyeli hash map'ler, veriyi farklı "bucket"lara ayırarak birleştirme işleminin paralel olarak yürütülmesine olanak tanır; örneğin, farklı thread'ler farklı bucket'lar üzerinde çalışabilir. Ancak, sabit hash map'ler tüm toplama durumunu tek boyutlu bir dizide sakladığı için bu tür bir paralel birleştirme mümkün olmuyordu, bu da performansı düşüren ana faktördü.
Bu performans darboğazını aşmak için başlangıçta tek boyutlu diziyi iki seviyeli bir yapıya dönüştürme fikri düşünülse de, bunun ek yük getirmesi nedeniyle verimsiz olduğu anlaşıldı. Nikita T. tarafından önerilen daha etkili bir çözüm ise, her bir birleştirme işçi thread'inin GROUP BY anahtarlarının ayrık alt kümeleri üzerinde doğrudan ve yerinde çalışmasını sağlamaktı. Bu yaklaşım, herhangi bir veri dönüşümüne gerek kalmadan ve yarış koşulları oluşturmadan birleştirme işleminin paralelleştirilmesine imkan tanıyor. Yazarın uygulaması bu prensibe dayanarak ClickHouse'un sabit hash map birleştirme performansını önemli ölçüde artırmayı hedefliyor.
ClickHouse'un sabit hash map toplama birleştirme süreçlerinin paralelleştirilmesi, sorgu performansındaki tutarsızlıkları gidererek daha hızlı ve öngörülebilir veri işleme sağlıyor.