Satır Tabanlı mı Sütun Tabanlı mı? Verinin Diskte Duruşu Sorgunuzu Nasıl Etkiler
İki yaklaşım aynı tabloyu diske farklı sırayla yazar: biri kaydı bütün tutar, diğeri sütunu. Bu tek fark, hangi sorgunun hızlı, hangi güncellemenin pahalı olacağını belirler.
Bir bakışta
- Satır tabanlı düzen tek kaydın tamamına, sütun tabanlı düzen çok kaydın az sütununa göre kurulmuştur. Sipariş ekranı birinci soruyu, aylık satış raporu ikinci soruyu sorar.
- Sütun tabanlı sistemde sorgu yalnız ihtiyaç duyduğu sütunları okur. Geniş tablolarda kullanılmayan sütunların diskten hiç okunmaması, analitik sorguları hızlandırır.
- Tek kayıt güncellemek sütun tabanlı sistemde pahalıdır. Bir kaydın değerleri farklı sütun dosyalarına dağıldığı için küçük ve sık yazmalar bu düzene uymaz.
- Çoğu kurumda ikisi birlikte çalışır. İşlem verisi satır tabanlı sistemde doğar, analiz için sütun tabanlı bir depoya aktarılır.
Aynı tablo, diske iki farklı sırayla yazılır
Bir satış tablosu düşünün: sipariş numarası, tarih, müşteri, ürün, şehir, tutar ve daha birçok sütun. Satır tabanlı veritabanı bu tabloyu kayıt kayıt yazar: ilk siparişin bütün sütunları yan yana, ardından ikinci siparişin bütün sütunları. Sütun tabanlı veritabanı ise önce bütün siparişlerin numaralarını, sonra bütün tarihleri, sonra bütün tutarları art arda yazar.
ClickHouse belgeleri farkı tam bu şekilde tanımlar: satır tabanlı düzende her satırın sütun değerleri birlikte saklanır, sütun tabanlı düzende her sütunun değerleri arka arkaya saklanır. Mantıksal tablo, SQL sorgusu ve sonuç iki yaklaşımda da aynıdır; değişen yalnız fiziksel düzen ve bunun sonucunda diskten ne kadar veri okunduğudur.
Bu yüzden "hangisi daha hızlı" sorusunun tek bir cevabı yoktur. Doğru soru, sistemin en sık hangi sorguyu çalıştırdığı ve verinin sisteme nasıl geldiğidir: tek tek ve sürekli mi, yoksa belirli aralıklarla toplu olarak mı.
Sorgunun şekli hangi düzeni seçtirir?
Bir sorgunun maliyetini iki soru belirler: kaç satıra dokunuyor ve kaç sütuna ihtiyaç duyuyor? Bu iki eksen dört tipik durumu ortaya çıkarır.
Az satırın bütün sütunları istendiğinde, örneğin müşteri hizmetleri ekranında tek bir siparişin tüm bilgisi açıldığında, satır tabanlı düzen kazanır; kayıt tek parça durur ve bir indeksle doğrudan bulunur. Çok satırın az sütunu istendiğinde, örneğin bütün yılın satışları şehir bazında toplandığında, sütun tabanlı düzen kazanır; ClickHouse belgelerinin vurguladığı gibi yalnız gereken sütunlar diskten okunur.
Az satırın az sütunu istendiğinde, örneğin bir siparişin yalnız durumu sorgulandığında, iyi bir indeksle satır tabanlı sistem yeterlidir ve fark hissedilmez. Çok satırın bütün sütunları istendiğinde, örneğin tam tablo dışa aktarımında, iki düzen de veriyi baştan sona okumak zorundadır; sütun tabanlı düzenin buradaki avantajı büyük ölçüde sıkıştırmadan gelir.
Düzeni, sorgunun dokunduğu satır ve sütun sayısı seçer
Ölçüt ölçüt iki düzen
- Okuma: Satır tabanlı: tek kaydı bütün olarak getirmede hızlı. / Sütun tabanlı: geniş tablolarda az sütunla çok satır taramada hızlı.
- Yazma: Satır tabanlı: tek kayıt eklemek ya da güncellemek ucuz. / Sütun tabanlı: toplu yüklemeye uygun, tek tek ve sık yazmada pahalı.
- Güncelleme ve silme: Satır tabanlı: kayıt yerinde değiştirilir. / Sütun tabanlı: değerler farklı sütun dosyalarına dağıldığı için değişiklik daha çok iş çıkarır.
- Sıkıştırma: Satır tabanlı: farklı tipler yan yana olduğu için sınırlı. / Sütun tabanlı: aynı tipteki ve tekrar eden değerler yan yana durduğu için daha etkili.
- Tipik kullanım: Satır tabanlı: sipariş, ödeme, üyelik gibi işlemsel sistemler. / Sütun tabanlı: veri ambarı, raporlama, olay ve kayıt (log) analizi.
Sıkıştırmanın etkisi veri sıralandığında artar. Şehir sütununa göre sıralanmış bir tabloda aynı şehir adı art arda tekrar eder ve tek bir değer ile tekrar sayısı olarak saklanabilir; satır düzeninde bu tekrar diğer sütunların arasına dağılır.
Bir e-ticaret şirketinde iki düzenin yan yana yaşaması
Kurgusal bir e-ticaret şirketinde müşteri siparişi verdiğinde kayıt satır tabanlı bir işlem veritabanına yazılır. Ödeme onayı, stok düşümü ve kargo durumu da aynı kaydı küçük güncellemelerle değiştirir. Bu iş yükü saniyeler içinde çok sayıda küçük yazma demektir; satır tabanlı düzen tam bunun için uygundur.
Pazarlama ekibi ise kampanya sonrasında ürün kategorisi, şehir ve gün bazında satışları görmek ister. Bu soruyu işlem veritabanında sormak hem yavaş olur hem de sipariş akışını yavaşlatır. Şirket bu yüzden her gece siparişleri sütun tabanlı bir analitik depoya toplu olarak aktarır. Raporlar orada çalışır, işlem sistemi yalnız kendi işini yapar.
Bu düzende iki tarafın sınırı açıktır: veri satır tabanlı sistemde doğar ve orada düzeltilir, sütun tabanlı depo onun okumaya uygun bir kopyasıdır. Analitik depodaki bir rakam yanlış görünüyorsa düzeltme kaynakta yapılır ve bir sonraki aktarımda depoya yansır.
Hangi durumda hangisi?
- Uygulamanız tek tek kayıt ekliyor, güncelliyor ve bir kaydı bütün olarak okuyorsa satır tabanlı bir ilişkisel veritabanı seçin.
- Ekipler geniş tablolar üzerinde toplama, gruplama ve zaman serisi sorguları çalıştırıyorsa ve veri toplu yükleniyorsa sütun tabanlı bir analitik sistem seçin.
- Hem işlem hem rapor ihtiyacı varsa ve veri hacmi küçükse, tek bir satır tabanlı sistem ve iyi indekslerle başlamak çoğu zaman yeterlidir; ayrı bir analitik depo, raporların işlem sistemini yavaşlatmaya başladığı noktada gündeme gelir.
- Bazı satır tabanlı veritabanları tabloya sütun tabanlı indeks ya da eklenti ekleme imkânı sunar. Bu karma çözüm, ayrı bir sistem kurmadan analitik sorguları hızlandırabilir; ancak yazma yükünü ve bakım maliyetini artırabileceği için önce test edilmelidir.
Sütun tabanlı sisteme geçen ekiplerin düştüğü tuzaklar
Sütun tabanlı sistemler hızlıdır ama işlem veritabanı alışkanlıklarıyla kullanıldığında bu hızın büyük kısmı kaybolur.
İlk tuzak yüklemededir. Kayıtları geldiği anda tek tek eklemek, her eklemede sütun dosyalarına küçük parçalar yazılmasına ve arka planda sürekli birleştirme işine yol açar; kayıtları toplayıp aralıklı ve toplu yüklemek gerekir. İkinci tuzak sorgu alışkanlığıdır: işlem sisteminde zararsız görünen ve bütün sütunları getiren sorgu, sütun tabanlı sistemde düzenin sağladığı avantajı tamamen ortadan kaldırır. Üçüncüsü, sık değişen veriyi analitik depoda güncellemeye çalışmaktır; değişiklik kaynakta yapılıp toplu aktarılmalıdır. Son olarak tablonun hangi sütuna göre sıralı saklanacağı baştan düşünülmezse hem sıkıştırma hem filtreleme verimi düşer; en sık filtrelenen sütun sıralama için iyi bir başlangıçtır.
Satır tabanlı alışkanlık, sütun tabanlı sistemi yavaşlatır
Mindset programlarında depolama düzenleri
Veritabanı Yönetim Sistemleri ve Uygulamaları programı, ilişkisel ve NoSQL veritabanlarını, veri modelleme ve tasarımı, veritabanı yönetimi ve optimizasyonu birlikte ele alır. İşlem sistemi ile analitik depo arasındaki sınırı çizmesi gereken BT ve veri ekipleri için temel çerçeveyi kurar.
Sütun tabanlı motorların içini anlamak isteyen veri mühendisleri için Kolonlu Depolama ve Analitik Motor İç Yapısı programı dosya formatları, kodlama ve sıkıştırma, vektörize yürütme ve sorgu planı konularına iner.
İlgili Mindset programı
Veritabanı Yönetim Sistemleri ve Uygulamaları
Sık sorulan sorular
Sütun tabanlı veritabanı NoSQL midir?
Zorunlu olarak değil. Sütun tabanlı analitik veritabanlarının çoğu SQL ile sorgulanır ve tablo kavramını korur; fark yalnız verinin diskte saklanış biçimindedir. "Geniş sütun" (wide-column) olarak anılan bazı NoSQL sistemleri ise adına rağmen farklı bir veri modelidir ve analitik sütun düzeniyle karıştırılmamalıdır. Bir sistemi değerlendirirken adına değil, sorgu dili ve depolama düzenine bakmak gerekir.
Satır tabanlı bir veritabanında analitik sorgular nasıl hızlandırılır?
Önce sorgunun gerçekten ihtiyaç duyduğu sütunları seçin ve filtrelenen sütunlara uygun indeks ekleyin. Sık çalışan özet raporlar için önceden hesaplanmış özet tablolar ya da materyalize görünümler kullanılabilir. Raporlar işlem sistemini yavaşlatıyorsa, okumaları bir kopya sunucuya yönlendirmek ilk adımdır. Bunlar yetmediğinde sütun tabanlı bir analitik depoya geçiş gündeme gelir.
Parquet gibi dosya formatları veritabanı mıdır?
Hayır, bunlar sütun tabanlı dosya formatlarıdır. Veriyi sütun düzeninde ve sıkıştırılmış olarak dosyaya yazarlar, ama sorgu motoru, kullanıcı yetkisi ya da işlem yönetimi sunmazlar. Analitik motorlar bu dosyaları doğrudan okuyabilir. Bu yüzden veri gölü mimarilerinde depolama dosya formatında, sorgulama ise ayrı bir motorda yapılır.
Sütun tabanlı sistemde tek bir kaydı güncellemek imkânsız mı?
İmkânsız değildir, ama pahalıdır ve sistemlerin çoğu bunu sık yapılacak bir işlem olarak tasarlamaz. Güncelleme genellikle değişen bölümün yeniden yazılması ya da değişikliğin ayrı bir kayıtta tutulup sonradan birleştirilmesiyle yapılır. Bu nedenle sık değişen veriyi kaynakta, satır tabanlı sistemde güncellemek ve analitik depoya değişiklikleri toplu aktarmak daha sağlıklıdır.