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

Büyük modeller: artımlı yenileme, hibrit tablolar, toplama tabloları ve bileşik modeller

RangeStart/RangeEnd ve katlama şartı, artımlı yenileme politikası, gerçek zamanlı DirectQuery bölümüyle hibrit tablo, kullanıcı tanımlı ve otomatik toplamalar, isabet kontrolü, Dual ve bileşik model, büyük model depolama biçimi, XMLA ile bölüm yenileme, Direct Lake karşılaştırması ve lisans gereksinimleri.

Uygulamada aç, 12 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ç.

“Kurumsal model” dersinde depolama modlarını, toplamaları ve artımlı yenilemeyi kısaca tanıdın; “Veri bağlantıları” dersinde katlamanın neden önemli olduğunu gördün. Bu ders o başlıkları bir üretim projesi gibi ele alıyor: mekanizma, sayılar, tuzaklar ve lisans gerçekleri.

Senaryo: Anadolu Market büyüdü

Bu uygulamadaki Satislar tablosu 1.620 satırdır. Şimdi şirketin beş yılda 900 milyon satış satırına ulaştığını düşün. Üç şikâyet var:

Her şikâyetin ayrı bir aracı var: artımlı yenileme süreyi, büyük model biçimi ve toplamalar belleği ve sorgu hızını, hibrit tablo tazeliği çözer. Yanlış araç seçmek, bir sorunu çözerken diğerini büyütür.

Artımlı yenileme: mekanizma

Power Query’de tam olarak RangeStart ve RangeEnd adlı iki Tarih/Saat parametresi oluşturulur. Adlar ayrılmıştır ve büyük-küçük harfe duyarlıdır. Olgu tablosu bunlarla filtrelenir:

let
    Kaynak = Sql.Database("sql-anadolu", "SatisDW"),
    Satis = Kaynak{[Schema = "dbo", Item = "Satislar"]}[Data],
    Filtre = Table.SelectRows(Satis, each [Tarih] >= RangeStart and [Tarih] < RangeEnd)
in
    Filtre

Yayımladıktan sonra Service bu parametrelere kendi değerlerini verir ve her bölüm (partition) için ayrı bir sorgu gönderir. Filtre kaynağa katlanırsa her bölüm sorgusu yalnızca kendi satırlarını çeker. Katlanmazsa her bölüm tüm tabloyu indirir ve filtreyi ağ geçidinde ya da Service’te uygular. Learn bunun yenilemeyi yavaşlattığını ve kaynakları tükettiğini, yani artımlı yenilemenin amacını boşa çıkardığını söyler.

Sınır kuralı: büyük-eşit ve küçük

Başta >=, sonda < kullanılır. İki uçta da <= kullanırsan gece yarısındaki bir satır iki komşu bölüme birden girer ve çift sayılır. Bu hata toplamı yalnızca biraz şişirdiği için uzun süre fark edilmez.

Politika ve bölümler

Tabloya sağ tık → Artımlı yenileme. Örnek politika: “Son 3 yılı arşivle, son 10 günü artımlı yenile, yalnızca tam günler”. Service eski dönemleri yıl bölümlerinde, yakın dönemleri daha küçük bölümlerde tutar; her yenilemede yalnızca son 10 günün bölümleri yeniden yüklenir.

Bu uygulamanın verisiyle bir benzetim: yenileme 1 Ocak 2025 sabahı çalışıyor ve “yalnızca tam günler” açık. Pencere 22–31 Aralık 2024’tür. Motorla sayınca bu pencerede 31 satır ve 25.897,20 net satış var; dokunulmayan arşivde 1.589 satır kalıyor. Yani her gece verinin yaklaşık %1,9’u işleniyor. 900 milyon satırlık modelde oran benzer kalırsa dört saatlik yenileme dakikalara iner.

AyarNe yapar?Dikkat
ArşivleTutulacak geçmiş dönemDaha eskisi modelden düşer
Artımlı yenileHer seferinde yeniden yüklenen dönemGeriye dönük düzeltmeler (iade, iptal) bu pencereye sığmalı
Yalnızca tam günlerBugünün yarım gününü yüklemezGerçek zamanlı bölüm için zorunlu; saat dilimi varsayılan UTC
Veri değişikliklerini algılaDeğişmemiş bölümleri atlarBölümleme sütunundan farklı bir “son güncelleme” sütunu ister

Anadolu Market’te iadeler satıştan 30 gün sonra kaydediliyorsa 10 günlük pencere yetmez: iade edilen satır arşiv bölümünde eski hâliyle kalır. Pencereyi iş kuralına göre seç.

Sık hatalar

Hibrit tablo: gerçek zamanlı son bölüm

Politikadaki “En son verileri DirectQuery ile gerçek zamanlı al” seçeneği, yenileme penceresinden sonraki dönem için bir DirectQuery bölümü ekler. Tablo artık hibrittir: geçmiş bellekte, bugün kaynakta. Satış direktörünün “bugünü canlı göster” isteği böyle karşılanır.

Mekanizma: “Bu yıl” toplamını isteyen bir görsel için motor bellekteki bölümleri tarar, bugünün bölümü için kaynağa SQL gönderir ve sonuçları birleştirir. Yani her görsel sorgusu kaynağa da gider. Kaynak veritabanı bu yükü kaldırmalı; Dual boyutlar ve toplama tabloları bu yükü azaltır.

Kullanıcı tanımlı toplama tabloları

Toplama tablosu (aggregation), ayrıntı olgu tablosunun daha kaba bir özetidir. Kullanıcı yalnızca ayrıntı tablosunu görür; motor sorguyu özetle cevaplayabiliyorsa özete gider (isabet, hit), cevaplayamıyorsa ayrıntıya düşer (ıska, miss).

Kurulum (Learn’e göre)

Motorla bir benzetim

Ay × kategori düzeyinde bir özet tablo:

EVALUATE
SUMMARIZECOLUMNS(
    Tarih[YilAy], Kategoriler[Kategori],
    "Tutar", SUM(Satislar[Tutar]),
    "Satir", COUNTROWS(Satislar)
)

Sonuç 199 satırdır; ayrıntı 1.620 satır. Gerçek modelde oran çok daha çarpıcıdır: 900 milyon satır birkaç bin satıra iner. Özet ile ayrıntı aynı sonucu vermeli; bunu sorguyla doğrularsın:

EVALUATE
VAR o = SUMMARIZECOLUMNS(Tarih[YilAy], Kategoriler[Kategori], "Tutar", SUM(Satislar[Tutar]))
RETURN ROW("OzetTutar", SUMX(o, [Tutar]), "AyrintiTutar", SUM(Satislar[Tutar]), "OzetSatir", COUNTROWS(o))

İki tutar da 1.346.189,85 çıkar. Bu toplamı [Toplam Satış] ölçüsüne aittir.

Anti-kalıp: ölçünün filtresi özette yok

Raporlar ise [Net Satış] kullanıyor ve bu ölçü Satislar[Durum] <> "İptal" filtresi uygular. Özet tabloda Durum sütunu yoksa motor bu filtreyi özetle cevaplayamaz ve her sorgu ayrıntıya düşer. Toplama tablosu vardır ama hiç kullanılmaz. Çözüm Durum’u özetin GroupBy sütunlarına eklemektir: özet 431 satıra çıkar, iptaller dışarıda bırakılınca 1.250.772,45 verir, yani [Net Satış] ile aynı. Kural: özetin taneciği (grain), raporlardaki ölçülerin kullandığı bütün sütunları kapsamalı.

Toplanamayan ölçüler

Güvenlik ve tazelik

İsabeti nasıl ölçersin?

Otomatik toplamalar

Otomatik toplamalar, son 7 günün sorgu günlüğünden öğrenerek System özet tablolarını kendisi oluşturur ve günceller. Ayarı anlam modelinin Service’teki Ayarlar sayfasındadır; bir kaydırıcıyla önbellekten cevaplanacak sorgu yüzdesi seçilir.

Ne zaman hangisi? Sorgu kalıpları belli ve az sayıdaysa kullanıcı tanımlı özet daha öngörülebilirdir. Kullanıcılar çok farklı açılardan sorguluyorsa otomatik toplama emek kazandırır.

Bileşik model ve depolama modu seçimi

Toplamaların isabet alması, ilişkilerin normal kalmasına bağlıdır. Learn’in tek kaynaklı model için verdiği kural:

Çok tarafıBir tarafı normal ilişki için
DualDual
ImportImport ya da Dual
DirectQueryDirectQuery ya da Dual

Yani boyutlar hem Import özete hem DirectQuery ayrıntıya bağlanacaksa tek doğru seçim Dual’dır. Boyut Import kalırsa DirectQuery ayrıntıyla ilişkisi sınırlı (limited) olur. Çoka çok ilişkiler her zaman sınırlıdır; farklı kaynaklar arasındaki ilişki yalnızca iki taraf da Import ise normaldir.

TabloModNeden
Satislar (900 M satır)DirectQuery (hibritse son bölüm)Belleğe alınmaz; ayrıntı sorguları için
Satış özeti (ay × kategori × durum)Import, gizliRaporların çoğu buradan cevaplanır
Tarih, Urunler, Kategoriler, MusterilerDualİki tarafa da normal ilişki
Küçük bağımsız arama tablolarıImportDirectQuery tabloya bağlı değilse

Büyük model biçimi ve XMLA ile bölüm yenileme

Büyük anlam modeli depolama biçimi (Large semantic model storage format), modelin varsayılan 1 GB sınırını aşıp kapasitenin izin verdiği boyuta kadar büyümesini sağlar. Learn’e göre Fabric F, Premium P, Embedded A SKU’larında ve PPU’da vardır; ayrılmış kapasitedeki Pro çalışma alanlarında 1 GB ile sınırlıdır. Service’te modelin Ayarlar → Büyük anlam modeli depolama biçimi anahtarıyla açılır; Premium çalışma alanı bunu yeni modeller için varsayılan yapabilir. 1 GB’ı aşacak artımlı yenileme modellerinde ilk yenilemeden önce açılmalıdır. Ayrıca XMLA yazma performansını iyileştirdiği için küçük modellerde de önerilir.

Bellek gerçeği: yenileme sırasında model geçici olarak daha fazla bellek ister. Kapasitenin yarısına yaklaşan bir model tam yenilemede belleği aşabilir; tek tek bölüm yenilemek bu yüzden önemlidir.

XMLA uç noktası varsayılan olarak salt okunurdur; yazma işlemleri için kapasite ayarından Okuma Yazma açılır. SQL Server Management Studio’da TMSL ile tek bir bölüm yenilenebilir:

{
  "refresh": {
    "type": "full",
    "objects": [
      { "database": "AnadoluSatis", "table": "Satislar", "partition": "2024Q4" }
    ]
  }
}
Yenileme yoluSüre sınırı (Learn)
Pro, zamanlanmış2 saat
Premium, zamanlanmış5 saat
XMLA uç noktasıSınır yok; günlük 48 yenileme sınırına da sayılmaz

Çok büyük modellerde “önyükleme” (bootstrapping) yapılır: nesneler veri yüklenmeden oluşturulur, sonra geçmiş bölümler tek tek doldurulur. Eski bir bölümü (ör. düzeltilmiş 2022 verisi) yeniden yüklemek de XMLA (SSMS ya da TMSL betiği) veya gelişmiş yenileme REST API’sinin objects parametresiyle yapılır (Premium, PPU, Embedded). Unutma: Desktop’ta yazılmış bir modelde XMLA ile yazma yapılınca model artık .pbix olarak indirilemez; kaynak dosyanı sakla.

Direct Lake ile karşılaştırma ve karar tablosu

Veri Fabric’te Delta tablolarındaysa “Kurumsal model” dersindeki Direct Lake seçeneği çoğu artımlı yenileme işini ortadan kaldırır: veri kopyalanmaz, “yenileme” tablonun yeni sürümüne bakmaktır (çerçeveleme). Bedeli, verinin önce bir göl evine ya da ambara taşınmış olmasıdır.

SeçenekTazelikSorgu hızıKaynak yüküNe zaman?
Import + artımlı yenilemeSon yenilemeEn iyiYenilemede düşükGecelik tazelik yeterli, kaynak ilişkisel
Hibrit tabloBugün canlıGeçmiş hızlı, bugün kaynağa bağlıHer sorguda biraz“Bugünü göster” isteği, Premium/PPU
Bileşik + toplamaAyrıntı canlı, özet son yenilemeİsabette hızlı, ıskada yavaşIskalarda yüksekVeri belleğe sığmıyor, sorgular çoğunlukla özet
Direct LakeDelta’nın son sürümüImport’a yakınYok (OneLake okunur)Veri zaten Fabric’te
Saf DirectQueryCanlıKaynağa bağlıHer sorgudaSaniyeler önemli, kaynak çok güçlü

Lisans özeti (Learn’e göre)

ÖzellikProPPUPremium / Fabric kapasitesi
Artımlı yenilemeVarVarVar
Gerçek zamanlı DirectQuery bölümüYokVarVar
Büyük model biçimiYalnızca ayrılmış kapasitede, 1 GBVarVar
XMLA okuma-yazmaYokVarVar
Otomatik toplamalarYokVarVar

Kontrol listesi

Alıştırmalara geç (12)