Ana içeriğe geç
Kesit Power BI
İleri · İleri Modelleme

Performans ve VertiPaq

Model neden yavaş? Kardinalite, sıkıştırma, Performans Analizi, DAX Studio ve iyi alışkanlıklar.

Uygulamada aç, 11 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

VertiPaq nasıl sıkıştırır?

Sonuç: Bir sütunun boyutunu en çok kardinalitesi (farklı değer sayısı) belirler. Satır sayısı ikinci sırada gelir.

Modeli küçültmek

Ölçü ölçmek

DAX alışkanlıkları

YerineBunu yazNeden?
FILTER(Satislar, Satislar[Kanal] = "Web")Satislar[Kanal] = "Web"Tüm tabloyu satır satır taramak yerine tek sütunda filtre
a / bDIVIDE(a, b)Sıfıra bölme güvenli; daha okunur
Aynı ifadeyi iki kez yazmakVARBir kez hesaplanır
SUMX(Satislar, [Ölçü])SUMX(VALUES(Urunler[Urun]), [Ölçü])Daha az bağlam geçişi
IFERROR ile hatayı gizlemekHatanın kaynağını düzeltmekIFERROR motoru yavaşlatır, hatayı saklar
Çift yönlü ilişkiGerektiğinde CROSSFILTER ile ölçüdeBelirsizlik ve gereksiz filtre yayılımı

Büyük veri için

Uzmanlaş

Bir sütunun bedelini ölçmek: kardinalite

Anadolu Market'in modeli büyüdükçe dosya şişiyor ve yenileme uzuyor. İlk soru “hangi tablo büyük?” değil, “hangi sütun pahalı?” olmalı. VertiPaq her sütunu ayrı sıkıştırır; bir sütunun boyutunu en çok farklı değer sayısı (kardinalite) belirler. Bunu ölçmenin en hızlı yolu tek satırlık bir sorgudur:

EVALUATE
ROW(
    "SatirNo",   DISTINCTCOUNT(Satislar[SatirNo]),
    "SiparisNo", DISTINCTCOUNT(Satislar[SiparisNo]),
    "Tarih",     DISTINCTCOUNT(Satislar[Tarih]),
    "Tutar",     DISTINCTCOUNT(Satislar[Tutar]),
    "MusteriNo", DISTINCTCOUNT(Satislar[MusteriNo]),
    "UrunNo",    DISTINCTCOUNT(Satislar[UrunNo]),
    "Durum",     DISTINCTCOUNT(Satislar[Durum]),
    "Kanal",     DISTINCTCOUNT(Satislar[Kanal])
)

1.620 satırlık Satislar tablosunda sonuç: SatirNo 1.620, SiparisNo 910, Tarih 533, Tutar 357, MusteriNo 136, UrunNo 38, Durum 4, Kanal 3. SatirNo her satırda farklıdır: sözlüğü tablo kadar büyüktür ve art arda tekrar olmadığı için tekrar uzunluğu kodlaması (RLE) hiçbir şey kazandırmaz. Kanal ise 3 değerle neredeyse bedavadır. Gerçek bir modelde aynı oranlar milyonlarca satırla çarpılır.

Sütun tipiTipik kardinaliteKarar
Satır kimliği, GUID, açıklama metniSatır sayısı kadarRaporda kullanılmıyorsa kaldır; detay gerekiyorsa ayrı bir detay sorgusu/sayfalandırılmış rapor
Sipariş no, fatura noYüksekSayım için gerekliyse tut ([Sipariş Sayısı]), metin değil tam sayı olsun
Tarih-saatÇok yüksekTarih ve saat olarak böl, saniyeyi at
Tutar, fiyatOrta-yüksekGereksiz ondalığı azalt; satırda hesaplanabiliyorsa (Adet × Fiyat) iki ucu tut, sonucu ölçüde hesapla
Kanal, durum, kategoriÇok düşükSorun değil

Tam sayı sütunları sözlük yerine değer kodlaması (value encoding) ile de saklanabilir; metin anahtar yerine tam sayı anahtar bu yüzden ucuzdur. Satır sırası da önemlidir: aynı değerler art arda geldikçe RLE daha iyi çalışır. VertiPaq sıralamayı kendisi seçer; sen kardinaliteyi düşürmeye odaklan.

Tarih-saat ve ondalık: kardinaliteyi kırmak

Saniye hassasiyetindeki bir zaman damgası bir yılda 31.536.000 farklı değer alabilir. Aynı bilgi tarih (365 değer) ve dakika düzeyinde saat (1.440 değer) olarak iki sütuna bölünürse toplam farklı değer 1.805'e iner. Bu oyun alanının WebOlaylari tablosu bu yüzden Tarih ve Saat sütunlarını ayrı tutar. Bölmeyi Power Query'de yap; DAX hesaplanmış sütunuyla bölersen orijinal sütun modelde kalır ve kazanç olmaz.

Ondalık sayılarda da benzer bir kazanç vardır. Kuruş hassasiyeti yeten bir tutarı “Sabit ondalık sayı” (Fixed decimal) türüne almak hem boyutu hem kayan nokta yuvarlama sürprizlerini azaltır. Oran sütunlarını (ör. 0,1537291) iki-dört basamağa yuvarlamak kardinaliteyi ciddi düşürür; ama yuvarlamayı iş biriminin onayıyla yap.

Otomatik tarih/saat: görünmeyen tablolar

Otomatik tarih/saat açıkken Power BI modeldeki her tarih sütunu için gizli bir tarih tablosu oluşturur. Bu modelde Satislar[Tarih], Satislar[TeslimTarihi], Musteriler[KayitTarihi], Musteriler[IlkSiparis], Calisanlar[IseGiris], projelerin üç tarih sütunu… her biri ayrı bir gizli tablo demektir. Her gizli tablo, sütundaki en eski ve en yeni yılı tam yıllarla kapsar; 1950 doğumlu bir kayıt varsa 70 yıllık bir tablo oluşur.

  • Kapatma yolu: Dosya → Seçenekler ve ayarlar → Seçenekler → Geçerli Dosya → Veri Yükü → Otomatik tarih/saat. Yeni dosyalar için Genel bölümündeki aynı ayarı da kapat.
  • Önce: kendi Tarih tablon “Tarih tablosu olarak işaretle” (Mark as date table) ile işaretlenmiş olmalı.
  • Yan etki: otomatik hiyerarşiyi (Tarih.Yıl, Tarih.Ay) kullanan görseller bozulur; bunları Tarih tablosunun sütunlarıyla yeniden kur. Hızlı ölçüler de otomatik hiyerarşiye yazılmışsa gözden geçir.

Performans Analizi'ni okumak

Performans Analizi (Performance analyzer) her görsel için üç süre verir. Kaydı başlat, Görselleri yenile de ve yavaş görseli aç:

Yüksek olanAnlamıİlk bakılacak yer
DAX sorgusuModel ya da ölçü yavaşSorguyu kopyala, DAX Studio'da Server Timings (DAX optimizasyonu dersi)
Görsel görüntülemeÇizim yavaş: çok nokta, ağır özel görsel, çok satırlı tabloNokta sayısını azalt, ilk N, özet görsel + detay sayfası
DiğerGörsel sırasını bekliyor; sayfadaki başka görseller önce çalışıyorSayfadaki görsel sayısını azalt

İlk ölçüm soğuk önbellekle yapılmadıysa sayılar yanıltır: ikinci yenilemede DAX süresi önbellekten gelir. Yavaş görselin süresini en az iki kez, aynı koşulla ölç.

Sayfa ve görsel sayısı

Her görsel en az bir sorgu gönderir; dilimleyiciler, kartlar ve metin kutusundaki dinamik başlıklar dahil. 30 görselli bir sayfada her biri 80 ms bile sürse sorgular sırayla beklediği için kullanıcı birkaç saniye bekler; Performans Analizi'nde bu bekleme “Diğer” sütununda birikir. Altı ayrı kart yerine çok değerli tek bir kart, on dilimleyici yerine filtre bölmesi, ayrıntı için ikinci bir sayfa kullan. Çapraz filtreleme her tıklamada sayfadaki tüm görselleri yeniden sorgulatır: gereksiz etkileşimleri “Etkileşimleri düzenle” ile kapat. Dilimleyicileri “Uygula” düğmesine bağlamak için Seçenekler → Geçerli Dosya → Sorgu azaltma (Query reduction) ayarlarını kullan.

Anti-kalıp: her soruya hesaplanmış sütun

“Hafta sonu satışı” istenince sık görülen çözüm, Satislar'a HaftaSonuMu hesaplanmış sütunu eklemektir. Bu sütun her yenilemede yeniden hesaplanır, olgu tablosunda yer kaplar ve Tarih tablosunda zaten olan bilgiyi kopyalar.

-- Kaçın: olgu tablosunda hesaplanmış sütun
HaftaSonuMu = RELATED(Tarih[HaftaSonu])

Doğru yer boyut tablosudur: Tarih[HaftaSonu] 1.096 satırda yaşar, filtre ilişki üzerinden Satislar'a iner. Ölçüde yalnızca bir sütun filtresi yazılır ve sonuç (bu modelde hafta sonları 341.997,65 ₺ net satış) aynı çıkar. Kural: Satır başına bilgi boyuttan geliyorsa boyutta kalsın; olguda yalnızca anahtarlar ve sayılar dursun.

Kontrol listesi (sırayla)1. Kullanılmayan sütunları kaldır (en büyük kazanç). 2. Yüksek kardinaliteli sütunları böl ya da yuvarla. 3. Otomatik tarih/saati kapat. 4. Olgu tablosundaki hesaplanmış sütunları boyuta, Power Query'ye ya da ölçüye taşı. 5. Sayfadaki görsel sayısını ve etkileşimleri azalt. 6. Ancak bundan sonra tek tek ölçüleri optimize et.
Alıştırmalara geç (11)