XMLA uç noktasıyla gelişmiş artımlı yenileme ve gerçek zamanlı veriler

Okuma/yazma işlemleri için XMLA uç noktasının etkinleştirildiği Premium kapasitedeki anlam modelleri, yalnızca araç, betik ve API desteği aracılığıyla daha gelişmiş yenileme, bölüm yönetimi ve meta veri dağıtımlarına olanak tanır. Ayrıca XMLA uç noktası üzerinden 48 yenileme işlemiyle sınırlı değildir ve zamanlanmış yenileme süresi sınırı uygulanmaz.

Bölümler

Anlam modeli tablo bölümleri görünür değildir ve Power BI Desktop veya Power BI hizmeti kullanılarak yönetilebilir. Premium kapasiteye atanan çalışma alanı modellerinde bölümler, SQL Server Management Studio (SSMS), açık kaynak Tablolu Düzenleyici gibi araçlar kullanılarak, Tablosal Model Betik Dili (TMSL) ile betik kullanılarak ve Tablolu Nesne Modeli (TOM) ile program aracılığıyla XMLA uç noktası üzerinden yönetilebilir.

bir modeli Power BI hizmeti ilk kez yayımladığınızda, yeni modeldeki her tablonun bir bölümü vardır. Artımlı yenileme ilkesi olmayan tablolarda, filtreler uygulanmadığı sürece bu bölüm söz konusu tablonun tüm veri satırlarını içerir. Artımlı yenileme ilkesine sahip tablolar için, bu ilk bölüm yalnızca Power BI ilkeyi henüz uygulamadığı için var olur. ve parametrelerine ve Power Query Düzenleyicisi uygulanan diğer filtrelere göre tablonuz için tarih/saat aralığı filtresini RangeStartRangeEnd tanımlarken Power BI Desktop'ta ilk bölümü yapılandırırsınız. Bu ilk bölüm yalnızca filtre ölçütlerinize uyan veri satırlarını içerir.

İlk yenileme işlemini gerçekleştirdiğinizde, artımlı yenileme ilkesi olmayan tablolar, tablonun varsayılan tek bölümünde yer alan tüm satırları yeniler. Artımlı yenileme ilkesi olan tablolar için yenileme ve geçmiş bölümleri otomatik olarak oluşturulur ve her satırın tarih/saatine göre satırlar bu tablolara yüklenir. Artımlı yenileme ilkesi verileri gerçek zamanlı olarak almayı içeriyorsa, Power BI tabloya bir DirectQuery bölümü de ekler.

Bu ilk yenileme işlemi, veri kaynağından yüklenmesi gereken veri miktarına bağlı olarak biraz zaman alabilir. Yenileme işlemlerinin daha fazla işleme ve yeniden hesaplama gerçekleştirmesi gerektiğinden modelin karmaşıklığı da önemli bir faktör olabilir. Bu işlem önyüklenebilir. Daha fazla bilgi için bkz . İlk tam yenilemede zaman aşımlarını önleme.

Bölümler için oluşturulur ve dönem ayrıntı düzeyine göre adlandırılır: Yıllar, üç aylık dönemler, aylar ve günler. En son bölümler olan yenileme bölümleri, ilkede belirttiğiniz yenileme dönemindeki satırları içerir. Geçmiş bölümler, yenileme dönemine kadar tam döneme göre satırlar içerir. Gerçek zamanlı etkinse, DirectQuery bölümü yenileme döneminin bitiş tarihinden sonra gerçekleşen veri değişikliklerini alır. Yenileme ve geçmiş bölümleri için ayrıntı düzeyi, ilkeyi tanımlarken seçtiğiniz yenileme ve geçmiş (depolama) dönemlerine bağlıdır.

Örneğin, bugünün tarihi 2 Şubat 2021 ise ve veri kaynağındaki FactInternetSales tablomuz bugünden bugüne kadar olan satırları içeriyorsa, ilkemiz gerçek zamanlı değişiklikleri eklemeyi belirtiyorsa, son bir günlük yenileme dönemindeki satırları yenileyin ve son üç yıllık geçmiş dönemdeki satırları depolayın. Daha sonra ilk yenileme işlemiyle, gelecekte değişiklikler için bir DirectQuery bölümü oluşturulur, bugünün satırları için yeni bir içeri aktarma bölümü oluşturulur, dün için geçmiş bölüm oluşturulur, 1 Şubat 2021 tam bir gün dönemi. Önceki tüm ay dönemi (Ocak 2021) için bir geçmiş bölüm oluşturulur, önceki tüm yıl dönemi (2020) için bir geçmiş bölüm oluşturulur ve 2019 ve 2018 tam yıl dönemleri için geçmiş bölümler oluşturulur. 2021'in ilk tam çeyreğini henüz tamamlamadığımız için tüm çeyrek bölümleri oluşturulmadı.

Diagram shows the partition naming granularity described in the text.

Her yenileme işleminde yalnızca yenileme dönemi bölümleri yenilenir ve DirectQuery bölümünün tarih filtresi yalnızca geçerli yenileme döneminden sonra gerçekleşen değişiklikleri içerecek şekilde güncelleştirilir. Güncelleştirilmiş yenileme dönemi içinde yeni bir tarih/saat içeren yeni satırlar için yeni bir yenileme bölümü oluşturulur ve yenileme döneminde zaten var olan bölümlerin içinde tarih/saat bulunan mevcut satırlar güncelleştirmelerle yenilenir. Yenileme döneminden eski bir tarih/saat içeren satırlar artık yenilenmez.

Tüm dönemler kapandıkça bölümler birleştirilir. Örneğin, ilkede bir günlük yenileme dönemi ve üç yıllık geçmiş depo dönemi belirtilirse, ayın ilk gününde, önceki ayın tüm gün bölümleri bir ay bölümünde birleştirilir. Yeni bir çeyreğin ilk gününde, önceki üç aydaki bölümlerin tümü bir çeyrek bölümle birleştirilir. Yeni yılın ilk gününde, önceki dört çeyrek bölümün tümü bir yıl bölümüyle birleştirilir.

Model her zaman tüm geçmiş depo döneminin bölümlerini ve geçerli yenileme dönemi boyunca tüm dönem bölümlerini tutar. Örnekte, üç yıllık geçmiş verileri 2018, 2019, 2020 bölümleri ve ayrıca 2021Q101 ay dönemi, 2021Q10201 günlük dönemi ve geçerli gün yenileme dönemi bölümü için bölümler halinde tutulur. Örnek, geçmiş verileri üç yıl boyunca koruduğundan, 2018 bölümü 1 Ocak 2022'de yapılan ilk yenilemeye kadar korunur.

Power BI artımlı yenileme ve gerçek zamanlı veriler sayesinde hizmet, bölüm yönetimini ilkeye göre sizin için işler. Hizmet tüm bölüm yönetimini sizin için işleyebilirken, XMLA uç noktası aracılığıyla araçları kullanarak bölümleri tek tek, sırayla veya paralel olarak seçmeli olarak yenileyebilirsiniz.

SQL Server Management Studio ile yenileme yönetimi

SQL Server Management Studio (SSMS), artımlı yenileme ilkeleri uygulaması tarafından oluşturulan bölümleri görüntülemek ve yönetmek için kullanılabilir. SSMS kullanarak, örneğin, tüm geçmiş verileri yenilemek zorunda kalmadan geri tarihli bir güncelleştirme gerçekleştirmek için artımlı yenileme döneminde olmayan belirli bir geçmiş bölümü yenileyebilirsiniz. SSMS, toplu olarak geçmiş bölümleri artımlı olarak ekleyerek/yenileyerek büyük modellerin geçmiş verilerini yüklemek için önyükleme yaparken de kullanılabilir.

Screenshot shows the Partitions window in SSMS.

Artımlı yenileme davranışını geçersiz kılma

SSMS ile, Tablosal Model Betik Dili ve Tablosal Nesne Modeli kullanarak yenilemeleri çağırma konusunda daha fazla denetime sahip olursunuz. Örneğin, SSMS'de, Nesne Gezgini bir tabloya sağ tıklayın ve tabloyu İşle menü seçeneğini belirleyin ve ardından TMSL yenileme komutu oluşturmak için Betik düğmesini seçin.

Screenshot shows the Script button in Process Table dialog.

Bu parametreler, varsayılan artımlı yenileme davranışını geçersiz kılmak için TMSL yenileme komutuyla kullanılabilir:

  • applyRefreshPolicy. Tabloda artımlı yenileme ilkesi tanımlanmışsa, applyRefreshPolicy ilkenin uygulanılıp uygulanmadığını belirler. İlke uygulanmazsa, bir işlemin tam işlemi bölüm tanımlarını değiştirmeden bırakır ve tablodaki tüm bölümler tamamen yenilenir. Varsayılan değeri, doğrudur.

  • effectiveDate. Artımlı yenileme ilkesi uygulanıyorsa, artımlı yenileme ve geçmiş dönemler için sıralı pencere aralıklarını belirlemek için geçerli tarihi bilmesi gerekir. effectiveDate parametresi geçerli tarihi geçersiz kılmanıza olanak tanır. Bu parametre, verilerin geçmişteki veya gelecekteki bir tarihe kadar (örneğin, gelecekteki bütçeler) artımlı olarak yenilendiği test, tanıtım ve iş senaryoları için kullanışlıdır. Varsayılan değer, geçerli tarihtir.

{ 
  "refresh": {
    "type": "full",

    "applyRefreshPolicy": true,
    "effectiveDate": "12/31/2013",

    "objects": [
      {
        "database": "IR_AdventureWorks", 
        "table": "FactInternetSales" 
      }
    ]
  }
}

TMSL ile varsayılan artımlı yenileme davranışını geçersiz kılma hakkında daha fazla bilgi edinmek için bkz . Yenile komutu.

En iyi performansı sağlama

Her yenileme işlemiyle, Power BI hizmeti her artımlı yenileme bölümü için veri kaynağına başlatma sorguları gönderebilir. Aşağıdaki yapılandırmayı sağlayarak başlatma sorgularının sayısını azaltarak artımlı yenileme performansını geliştirebilirsiniz:

  • Artımlı yenilemeyi yapılandırdığınız tablo tek bir veri kaynağından veri almalıdır. Tablo birden fazla veri kaynağından veri alıyorsa, her yenileme işlemi için hizmet tarafından gönderilen sorgu sayısı veri kaynağı sayısıyla çarpılarak yenileme performansı azaltılır. Artımlı yenileme tablosunun sorgusunun tek bir veri kaynağı için olduğundan emin olun.
  • Hem içeri aktarma bölümlerini artımlı yenileme hem de Direct Query ile gerçek zamanlı verileri içeren çözümler için tüm bölümlerin tek bir veri kaynağındaki verileri sorgulaması gerekir.
  • Güvenlik gereksinimleriniz izin verirse Veri kaynağı gizlilik düzeyi ayarını Kuruluş veya Genel olarak ayarlayın. Varsayılan olarak gizlilik düzeyi Özel'dir, ancak bu düzey verilerin diğer bulut kaynaklarıyla değişimini engelleyebilir. Gizlilik düzeyini ayarlamak için Diğer seçenekler menüsünü ve ardından Ayarlar> Veri kaynağı kimlik bilgilerini>düzenle Bu veri kaynağı için Kimlik bilgilerini>düzenle Gizlilik düzeyi ayarını seçin. Hizmette yayımlamadan önce Power BI Desktop modelinde Gizlilik düzeyi ayarlandıysa, yayımladığınızda hizmete aktarılamaz. Yine de hizmetteki anlamsal model ayarlarında ayarlamanız gerekir. Daha fazla bilgi edinmek için bkz . Gizlilik düzeyleri.
  • Şirket İçi Veri Ağ Geçidi kullanıyorsanız 3000.77.3 veya üzeri bir sürüm kullandığınızdan emin olun.

İlk tam yenilemede zaman aşımlarını önleme

Power BI hizmeti yayımladıktan sonra, modelin ilk tam yenileme işlemi artımlı yenileme tablosu için bölümler oluşturur, artımlı yenileme ilkesinde tanımlanan dönemin tamamı için geçmiş verileri yükler ve işler. Büyük miktarda veri yükleyen ve işleyen bazı modellerde, ilk yenileme işleminin süresi hizmet tarafından uygulanan yenileme süresi sınırını veya veri kaynağı tarafından uygulanan sorgu süresi sınırını aşabilir.

İlk yenileme işleminin önyüklenmesi, hizmetin artımlı yenileme tablosu için bölüm nesneleri oluşturmasına olanak tanır, ancak geçmiş verileri bölümlerin hiçbirine yükleyip işlemez. Daha sonra SSMS, bölümleri seçmeli olarak işlemek için kullanılır. Her bölüm için yüklenecek veri miktarına bağlı olarak, bu bölümlerden birinin veya daha fazlasının zaman aşımına neden olma olasılığını azaltmak için her bölümü sıralı olarak veya küçük toplu işlerde işleyebilirsiniz. Aşağıdaki yöntemler herhangi bir veri kaynağı için çalışır.

Yenileme İlkesi Uygula

Açık kaynak Tablosal Düzenleyici 2 aracı, ilk yenileme işlemini önyüklemek için kolay bir yol sağlar. Power BI Desktop'tan hizmete için tanımlanmış artımlı yenileme ilkesine sahip bir modeli yayımladıktan sonra, Okuma/Yazma modunda XMLA uç noktasını kullanarak modele bağlanın. Artımlı yenileme tablosunda Yenileme İlkesi Uygula'yı çalıştırın. Yalnızca ilke uygulandığında bölümler oluşturulur ancak bunlara veri yüklenmez. Ardından SSMS ile bağlanarak bölümleri sırayla veya toplu olarak yenileyip verileri yükleyip işleyin. Daha fazla bilgi için Tablosal düzenleyici belgelerindeki Artımlı yenileme bölümüne bakın.

Screenshot show the Tabular Editor with Apply Refresh Policy selected.

Boş bölümler için Power Query filtresi

Modeli hizmete yayımlamadan önce, Power Query Düzenleyicisi sütuna ProductKey 0 dışındaki herhangi bir değeri filtreleyen başka bir filtre ekleyin ve FactInternetSales tablosundaki tüm verileri etkili bir şekilde filtreleyin.

Screenshot shows the Power Query Editor with code that filters out the product key.

Power Query Düzenleyicisi'da Kapat ve Uygula'yı seçtikten, artımlı yenileme ilkesini tanımladıktan ve modeli kaydettikten sonra model hizmette yayımlanır. Hizmetten ilk yenileme işlemi modelde çalıştırılır. FactInternetSales tablosunun bölümleri ilkeye göre oluşturulur, ancak tüm veriler filtrelendiğinden hiçbir veri yüklenmez ve işlenmez.

İlk yenileme işlemi tamamlandıktan sonra Power Query Düzenleyicisi sütundaki ProductKey diğer filtre kaldırılır. Power Query Düzenleyicisi Kapat ve Uygula'yı seçip modeli kaydettikten sonra model yeniden yayımlanmaz. Model yeniden yayımlanırsa artımlı yenileme ilkesi ayarlarının üzerine yazar ve hizmetten sonraki bir yenileme işlemi gerçekleştirildiğinde modelde tam yenilemeyi zorlar. Bunun yerine, modelden sütundaki ProductKey filtreyi kaldıran Uygulama Yaşam Döngüsü Yönetimi (ALM) Araç Seti'ni kullanarak yalnızca meta veri dağıtımı gerçekleştirin. SSMS daha sonra bölümleri seçmeli olarak işlemek için kullanılabilir. SSMS'den tüm bölümlerde işlem yeniden hesaplaması içermesi gereken tüm bölümler tamamen işlendiğinde, hizmetten modeldeki sonraki yenileme işlemleri yalnızca artımlı yenileme bölümlerini yeniler.

İpucu

Power BI'ın iş zekası uzmanları topluluğu tarafından sağlanan videoları, blogları ve daha fazlasını gözden geçirin.

SSMS'den tabloları ve bölümleri işleme hakkında daha fazla bilgi edinmek için bkz . İşlem veritabanı, tablo veya bölümler (Analysis Services). TMSL kullanarak modelleri, tabloları ve bölümleri işleme hakkında daha fazla bilgi edinmek için bkz . Yenileme komutu (TMSL).

Veri değişikliklerini algılamak için özel sorgular

TMSL ve TOM, algılanan veri değişiklikleri davranışını geçersiz kılmak için kullanılabilir. Bu yöntem yalnızca bellek içi önbellekte son güncelleştirme sütununun kalıcı olmasını önlemek için kullanılamaz, aynı şekilde yapılandırma veya yönerge tablosunun ayıklama, dönüştürme ve yükleme (ETL) işlemleriyle hazırlandığı senaryoları etkinleştirerek yalnızca yenilenmesi gereken bölümleri işaretleyebilir. Bu yöntem, veri güncelleştirmeleri ne kadar süre önce gerçekleşirse gerçekleşsin yalnızca gerekli dönemlerin yenilendiği daha verimli bir artımlı yenileme işlemi oluşturabilir.

, pollingExpression basit bir M ifadesi veya başka bir M sorgusunun adı olarak tasarlanmıştır. Bir skaler değer döndürmelidir ve her bölüm için yürütülür. Döndürülen değer, artımlı yenilemenin en son gerçekleştiği değerden farklıysa, bölüm tam işleme için işaretlenir.

Aşağıdaki örnek, desteklenen değişiklikler için geçmiş dönemdeki 120 ayın tamamını kapsar. 10 yıl yerine 120 ay belirtilmesi, veri sıkıştırmanın o kadar verimli olmayabileceği anlamına gelir, ancak geçmişe dönük bir yılı yenilemek zorunda kalmamaktır; bu, bir ayın yedeklenmiş değişiklik için yeterli olacağı durumlarda daha pahalı olacaktır.

"refreshPolicy": {
    "policyType": "basic",
    "rollingWindowGranularity": "month",
    "rollingWindowPeriods": 120,
    "incrementalGranularity": "month",
    "incrementalPeriods": 120,
    "pollingExpression": "<M expression or name of custom polling query>",
    "sourceExpression": [
    "let ..."
    ]
}

İpucu

Power BI'ın iş zekası uzmanları topluluğu tarafından sağlanan videoları, blogları ve daha fazlasını gözden geçirin.

Yalnızca meta veri dağıtımı

.pbix dosyasının yeni bir sürümünü Power BI Desktop'tan çalışma alanına yayımlarken, aynı ada sahip bir model zaten varsa mevcut modeli değiştirmeniz istenir.

Screenshot shows the Replace model dialog.

Bazı durumlarda, özellikle artımlı yenileme ile modeli değiştirmek istemeyebilirsiniz. Power BI Desktop'taki model, Power BI hizmeti modelden çok daha küçük olabilir. Power BI hizmeti modelde artımlı yenileme ilkesi uygulanmışsa, model değiştirilirse kaybolacak birkaç yıllık geçmiş verileri olabilir. Tüm geçmiş verilerin yenilenmesi saatler sürebilir ve kullanıcılar için sistem kapalı kalma süresine neden olabilir.

Bunun yerine, geçmiş verileri kaybetmeden yeni nesnelerin dağıtılmasını sağlayan yalnızca meta veri dağıtımı gerçekleştirmek daha iyidir. Örneğin, birkaç ölçü eklediyseniz verileri yenilemeye gerek kalmadan yalnızca yeni ölçüleri dağıtarak zaman kazandırabilirsiniz.

XMLA uç noktası okuma/yazma için yapılandırılmış premium kapasiteye atanan çalışma alanları için uyumlu araçlar yalnızca meta veri dağıtımını etkinleştirir. Örneğin, ALM Araç Seti Power BI modellerine yönelik bir şema fark aracıdır ve yalnızca meta verilerin dağıtımını gerçekleştirmek için kullanılabilir.

Analysis Services Git deposundan ALM Toolkit'in en son sürümünü indirin ve yükleyin. ALM Araç Seti'nin kullanımıyla ilgili adım adım yönergeler Microsoft belgelerine eklenmez. ALM Araç Seti belge bağlantıları ve desteklenebilirlik hakkındaki bilgileri Yardım şeridinde bulabilirsiniz. Yalnızca meta veri dağıtımı gerçekleştirmek için bir karşılaştırma gerçekleştirin ve kaynak olarak çalışan Power BI Desktop örneğini ve hedef olarak Power BI hizmeti mevcut modeli seçin. Görüntülenen farkları göz önünde bulundurun ve artımlı yenileme bölümleriyle tablonun güncelleştirmesini atlayın veya tablo güncelleştirmelerinin bölümlerini korumak için Seçenekler iletişim kutusunu kullanın. Hedef modelin bütünlüğünü sağlamak için seçimi doğrulayın ve ardından güncelleştirin.

Screenshot shows the ALM Toolkit window.

Program aracılığıyla artımlı yenileme ilkesi ve gerçek zamanlı veri ekleme

XMLA uç noktası aracılığıyla mevcut modele artımlı yenileme ilkesi eklemek için TMSL ve TOM'u da kullanabilirsiniz.

Not

Uyumluluk sorunlarını önlemek için Analysis Services istemci kitaplıklarının en son sürümünü kullandığınızdan emin olun. Örneğin, Karma ilkelerle çalışmak için sürüm 19.27.1.8 veya üzeri olmalıdır.

İşlem aşağıdaki adımları içerir:

  1. Hedef modelin gerekli en düşük uyumluluk düzeyine sahip olduğundan emin olun. SSMS'de [model adı]>Özellikler Uyumluluk Düzeyi'ne> sağ tıklayın. Uyumluluk düzeyini artırmak için createOrReplace TMSL betiği kullanın veya bir örnek için aşağıdaki TOM örnek kodunu denetleyin.

    a. Import policy - 1550
    b. Hybrid policy - 1565
    
  2. RangeStart model ifadelerine ve RangeEnd parametrelerini ekleyin. Gerekirse, Tarih/Saat değerlerini tarih anahtarlarına dönüştürmek için bir işlev de ekleyin.

  3. RefreshPolicy İstenen arşivleme (sıralı pencere) ve artımlı yenileme dönemlerinin yanı sıra ve RangeEnd parametrelerine göre hedef tabloyu filtreleyen bir kaynak ifade içeren RangeStart bir nesne tanımlayın. Gerçek zamanlı veri gereksinimlerinize bağlı olarak yenileme ilkesi modunu İçeri Aktar veya Karma olarak ayarlayın. Karma, Power BI'ın tabloya bir DirectQuery bölümü ekleyerek son yenileme zamanından sonra oluşan veri kaynağından en son değişiklikleri getirmesine neden olur.

  4. Yenileme ilkesini tabloya ekleyin ve Power BI'ın tabloyu gereksinimlerinize göre bölümlemesi için tam yenileme gerçekleştirin.

Aşağıdaki kod örneğinde, TOM kullanarak önceki adımların nasıl gerçekleştirildiği gösterilmektedir. Bu örneği olduğu gibi kullanmak istiyorsanız, AdventureWorksDW veritabanı için bir kopyanız olmalı ve FactInternetSales tablosunu bir modele aktarmalısınız. Kod örneği, ve RangeEnd parametrelerinin RangeStart ve işlevinin DateKey modelde mevcut olmadığını varsayar. FactInternetSales tablosunu içeri aktarmanız ve modeli Power BI Premium'da bir çalışma alanında yayımlamanız gerekir. Ardından kod örneğinin modelinize bağlanabilmesi için öğesini workspaceUrl güncelleştirin. Gerekirse daha fazla kod satırı güncelleştirin.

using System;
using TOM = Microsoft.AnalysisServices.Tabular;
namespace Hybrid_Tables
{
    class Program
    {
        static string workspaceUrl = "<Enter your Workspace URL here>";
        static string databaseName = "AdventureWorks";
        static string tableName = "FactInternetSales";
        static void Main(string[] args)
        {
            using (var server = new TOM.Server())
            {
                // Connect to the dataset.
                server.Connect(workspaceUrl);
                TOM.Database database = server.Databases.FindByName(databaseName);
                if (database == null)
                {
                    throw new ApplicationException("Database cannot be found!");
                }
                if(database.CompatibilityLevel < 1565)
                {
                    database.CompatibilityLevel = 1565;
                    database.Update();
                }
                TOM.Model model = database.Model;
                // Add RangeStart, RangeEnd, and DateKey function.
                model.Expressions.Add(new TOM.NamedExpression {
                    Name = "RangeStart",
                    Kind = TOM.ExpressionKind.M,
                    Expression = "#datetime(2021, 12, 30, 0, 0, 0) meta [IsParameterQuery=true, Type=\"DateTime\", IsParameterQueryRequired=true]"
                });
                model.Expressions.Add(new TOM.NamedExpression
                {
                    Name = "RangeEnd",
                    Kind = TOM.ExpressionKind.M,
                    Expression = "#datetime(2021, 12, 31, 0, 0, 0) meta [IsParameterQuery=true, Type=\"DateTime\", IsParameterQueryRequired=true]"
                });
                model.Expressions.Add(new TOM.NamedExpression
                {
                    Name = "DateKey",
                    Kind = TOM.ExpressionKind.M,
                    Expression =
                        "let\n" +
                        "    Source = (x as datetime) => Date.Year(x)*10000 + Date.Month(x)*100 + Date.Day(x)\n" +
                        "in\n" +
                        "    Source"
                });
                // Apply a RefreshPolicy with Real-Time to the target table.
                TOM.Table salesTable = model.Tables[tableName];
                TOM.RefreshPolicy hybridPolicy = new TOM.BasicRefreshPolicy
                {
                    Mode = TOM.RefreshPolicyMode.Hybrid,
                    IncrementalPeriodsOffset = -1,
                    RollingWindowPeriods = 1,
                    RollingWindowGranularity = TOM.RefreshGranularityType.Year,
                    IncrementalPeriods = 1,
                    IncrementalGranularity = TOM.RefreshGranularityType.Day,
                    SourceExpression =
                        "let\n" +
                        "    Source = Sql.Database(\"demopm.database.windows.net\", \"AdventureWorksDW\"),\n" +
                        "    dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],\n" +
                        "    #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] >= DateKey(RangeStart) and [OrderDateKey] < DateKey(RangeEnd))\n" +
                        "in\n" +
                        "    #\"Filtered Rows\""
                };
                salesTable.RefreshPolicy = hybridPolicy;
                model.RequestRefresh(TOM.RefreshType.Full);
                model.SaveChanges();
            }
            Console.WriteLine("{0}{1}", Environment.NewLine, "Press [Enter] to exit...");
            Console.ReadLine();
        }
    }
}