Hesaplanmış Sütun vs Metrik

Her uygulamada olduğu gibi, PBI'da da bazı temel yapı taşları var. Hesaplanmış sütunlar -calculated columns- ve metrikler  -measures-  PBI'ın temel konseptlerinden ikisi.

Önceki yazıda metrik (ölçü) ve hesaplanmış sütunlara örnekler vermiş ve kısa bir de giriş yapmıştık.

Örnek modelimizde 2 tane tablomuz var, Siparişler ve Müşteriler. Siparişler tablosundaki satır sayısı 35 milyon. Bu haliyle .pbix dosyasının büyüklüğü 490 MB.

Sipariş tutarını iki farklı yöntemle hesaplayacağız: doğrudan bir metrikle ve hesaplanmış alan üzerinden çalışan bir başka metrikle.

Önce ilk metriğimizi yazalım:

Siparişler := SUMX ('Siparişler'; 'Siparişler'[Fiyat] * 'Siparişler'[Miktar])

SUMX gibi "iterator" fonksiyonlarına daha sonra detaylı değineceğiz ama yukarıdaki formülün yaptığı şudur: "Siparişler tablosuna git, bu tabloda gördüğün her bir satır için Fiyat ve Miktar değerlerini çarp,  sonra bulduğun tüm değerleri topla."

Şimdi "Siparişler" tablosuna "Tutar" adında yeni bir hesaplanmış sütun ekleyelim. "Siparişler" tablosunu sağ tıklayarak veya "Modelling" tabından "New Column" diyerek formülü yazalım.

Tutar = 'Siparişler'[Fiyat] * 'Siparişler'[Miktar]

Şimdi siparişleri bu alan üzerinden yeni bir metrikle hesapalayalım:

Siparişler - 2 := SUM('Siparişler'[Tutar])

Her iki metriği de bir matriste gösterelim:

Her iki metrik de aynı değeri gösteriyor. Bu dosyayı  farklı bir isimle  kaydedip tekrar açıyorum.

Aynı anda açık olan iki .pbix dosyasının kullandığı hafıza miktarları şu şekilde:


Hesaplanmış sütunun olduğu dosyanın kullandığı ram miktarı 1.9 GB, diğeri 1.4GB. Arada kayda değer bir fark var.

Bir test daha yapıyorum, her iki dosya için de "Refresh" butonuna basıp veriyi sıfırdan çekmelerini sağlayıp süreleri kaydediyorum.


Hesaplanmış sütunun olduğu dosyanın güncellenmesi 92 saniye sürüyor, diğer dosyanınki ise 78 saniye. Her iki dosyanın da büyüklükleri birbirine yakın, hesaplanmış sütunun olduğu dosya 1 MB daha büyük.

Bir hareket daha yapıyorum: "Siparişler" tablosunda gözüken "Siparişler" metriğini seçip "Modelling" tabındaki "Home Table" listesinden "Müşteriler"'i seçiyorum.


Bunu yaptığımda, "Siparişler" metriği "Müşteriler" tablosunun altında gözüküyor. Yani PBI, bir metriği bir tablodan alıp diğerine taşımama müsade etti.

Eklediğimiz "Tutar" sütununu seçtiğimde ise, "Modelling" tabındaki "Home Table" listesi seçilebilir durumda değil, yani "Tutar" sütununu bir başka tabloya taşımama müsade etmiyor.

Buraya kadar bulduklarımızı özetlemek gerekirse, hesaplanmış sütunun olduğu dosya daha büyük bir hafızayı kullanıyor, dosya büyüklüğü az da olsa daha büyük ve  daha uzun sürede "refresh" ediyor. PBI, metriği bir tablodan diğerine taşımaya müsade ederken, hesaplanmış sütunu taşımaya müsade etmiyor.

Yazının asıl konusunu açabiliriz artık:

 Hesaplanmış sütunlar, tablolardaki diğer sütunlarınız gibidir.  Tek farkı PBI içindeyken hesaplanmış olmasıdır.  Bir tabloya aittir . Yerini bu yüzden değiştiremedik. Aynen diğer normal sütunlar gibi olduğundan  hafızada yer kaplar . Hesaplanmış sütunların hesaplandığı an,  dosyanın "refresh" edildiği andır  ve tablodaki her bir satır için hesaplanır. Bu yüzden "refresh" süresi daha uzundur. Tablodaki diğer sütunlar gibi olduğundan dosya büyüklüğünü de arttırır.

Hesaplanmış sütun mantığı aynı Excel'deki gibi olduğu için Excel kullanıcılarının büyük bir bölümüne kullanmak cazip ve kolay gelir. Fakat doğru bir kullanım tarzı değildir. Çok büyük olmayan modellerde kullanmak hız açısından pek farkettirmeyebilir, ama modeliniz büyüdükçe farkedecektir.

Metrik yazarak hesaplayabileceğiniz hiçbir şeyi hesaplanmış sütun kullanarak hesaplamayın.

Metrikler hesaplanırken öncelikle  işlemciyi  kullanır. İşlemci hafızadan daha hızlıdır. Hesaplanmış sütunlar gibi "refresh" esnasında her bir satır için değil,  anlık  olarak ve rapordaki filtrelerden kalan veriler üzerinden hesaplanır. Metrikler herhangi bir tabloda olabilir. İster Müşteri tablosunda tanımlarsınız, ister Sipariş tablosunda.  Metrikleri, herhangi bir tabloya doğrudan ait olmayan "havada asılı" hesaplamalar gibi düşünebilirsiniz.

Kısaca "hesap" yapmak istiyorsak, önceliği metrikle hesaplamaya vermemiz daha doğrudur.

Peki hesaplanmış sütunların hiç mi faydası yok?

Sütun değerlerini raporda filtre-slicer olarak kullanmaya ihtiyacınız varsa hesaplanmış sütun kullanmak daha mantıklı olabilir. Diyelim raporda fiyatı 100'den büyük olan sipariş satırlarını "Evet", "Hayır" diye ayırıp slicer olarak kullanmak istiyoruz. Bu durumda modele şöyle bir hesaplanmış sütun ekleyebiliriz;

Fiyatı 100 den Büyük Olan Sipariş =
IF ( 'Siparişler'[Fiyat] > 100; "Evet"; "Hayır" )

Ve bu sütunun değerlerini raporda slicer olarak kullanabiliriz. Aynı etkiyi metriklerle -bu haliyle- yapamayız.


Hesaplanmış sütun değeri  sadece ve sadece ilgili tablonun satırı için  anlamlı ve doğru bir bilgiyse, uzun ve karmaşık formülleri basitleştirmek adına kullanılabilir. Yukarıdaki örnekte, SUMX kullanarak sipariş tutarını bulduk. Hesaplanmış sütun değeri kullanarak yazdığımız formül daha kısaydı. (Hafıza kullanımı, refresh hızı farklarını unutmayın gene de.)

Bu iki durum haricinde, hesaplanmış sütun kullanmanızı tavsiye etmiyorum. Diğer tüm durumlar için metrik kullanmaya çalışmanızda fayda var.