Sql Server Analysis Services Küplerini Analysis Services olmadan çalıştırmak (Lokal/Offline Küpler)

Selamlar, birkaç gündür varlığından yeni haberdar olduğum aslında eski bir teknoloji olan ADOMD Data Provider ile Offline/Lokal Küp yaratmanın mümkün olduğunu öğrendim. Bu tarz bir imkan özellikle benim gibi Analysis Services ile yoğun şekilde ilgilenen ve müşterilerin bütçe, gereksinim ikileminde bir çözüm bulmaya çalışan danışmanlar için çok yararlı olabilecek bir çözüm. Eğer benim gibi önceden lokal küplerden haberdar olanlar varsa, kısaca lokal kübün özellkileri şu şekilde. Lokal küpler Analysis Services üzerinde olan küplerin çoğu özelliklerini barındırır. Ortak noktalarını yazmaktansa ortak olmaya noktaları yazmak daha mantıklı;

  • Lokal küplerde güvenlik yapısı bulunmuyor. Eğer lokal küplere erişimi sınırlandırmak isterseniz lokal kübün kendisi olan *.cub dosyasına erişimi sınırlamanız gerekir.
  • Lokal küplerde küplerde Incremental dediğimiz artan yükleme yapamıyoruz. Bir başka değişle kübe yeni bir veri eklemek istediğimizde eski *.cub dosyasını silip tekrar oluşturmamız gerekir.
  • Lokal küpler içlerinde gruplanmış (aggregated) veri tutmazlar, bu sebeple büyük lokal küplerde performans sorunları yaşamanız mümkündür fakat orta ölçekli küplerde çok iyi performans alabilirsiniz. Zaten büyük küpleride lokal küp yapmak çok mantıklı bir yaklaşım olmayacaktır. Lokal küpler küçük ve orta olçekli, komplike olmayan projelerde işinize yarayacaktır.
  • Yukarıda bahsettiklerimin çoğu lokal küplerin eksi taraflarıydı, eğer pozitif tarafından bakarsak, lokal küpler kolaylıkla paylaşılabilirler. Bir kübü kolaylıkla email yoluyla paylaşabilir veya kendi bilgisayarınızda lokal küpler oluşturup kullanabilirsiniz.
  • Lokal küp sayesinde Analysis Services lisans ücretlerine katlanmadan ve SQL Server yönetimine girmeden kolaylıkla küp teknolojisinden yararlanabilirsiniz.
  • Eğer Analysis Services ortamınız varsa ve bu verinin belli bir kısmını iş ortakları ile paylaşmak istiyorsanız, bunu lokal küpler sayesinde kolaylıkla yapabiliriniz. Sadece iş ortağınızın görmesi gereken kısmı lokal kübe yükleyerek paylaşabilirsiniz.

Bu tarz bir çözümü hemen küçük bir program ile gerçekleştirmeye karar verdim. Ben C# yazdığım için kod bloklarım C# dilindedir.

Çözümümü birkaç adıma ayırdım.

  1. Analysis Services’de ki belirtilen bir DB’ye bağlanarak  XMLA küp tanımları hazırlamak.
  2. Dosya sisteminde *.CUB tipinde Offline bir küp oluşturulacak ve 1. adımda hazırlanan XMLA tipindeki küp tanımları lokal kübe yüklenecek.
  3. *.CUB’ı Excel kullanarak görüntülemek ve MDX sorguları çalıştırmak.

Çözümümde yoğun şekilde XMLA kullanıyor olacağım. Kısaca bu teknolojidende bahsetmek gerekirse. XMLA aslında bir XML yapısıdır. Açılımı “XML for Analysis” dır. Analysis Services içersinde olan veritabanlarını XML ile tanımlamak için kullanılır. Bu sayede XMLA olarak tanımını hazırladığınız bir SSAS veritabanını başka bir SSAS server’ına kolaylıkla taşıyabilirsiniz. Tek yapmanız gereken SSMS ile XMLA açıp çalıştırmak olacaktır. XMLA sadece Microsoft’un kullandığı bir yapı değildir, bu bir standart olarak Microsoft, Hyperion ve SAS’ın oluşturduğu bir platform üzerinden yönetilir. Daha fazla bilgi için bu linke bakabilirsiniz.

1. Adım: SSAS’da varolan veritabanımızı XMLA formatına çevirelim.

Bu adımda iki farklı XMLA hazırlamamız gerekiyor. İlk hazırlayacağımız XMLA SSAS daki veritabanının CREATE için hazırlanacak olan, ikincisi ise veritabanındaki kübü PROCESS edecek olan XMLA’dir.

Bu metodları kullanmadan önce eklememiz gereken birkaç referans var onlarıda sizlerle paylaşıyorum:

using Microsoft.AnalysisServices.AdomdClient;
using Microsoft.AnalysisServices;

bunları yazacağınız programın en üstüne ekliyorsunuz tabi bunlara bağlı olarakda Referansları ekleyeceksiniz. İlgili dll’leride aşağıda bulabilirsiniz.,

C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.AnalysisServices.dll

C:\Program Files\Microsoft.NET\ADOMD.NET\110\Microsoft.AnalysisServices.AdomdClient.dll

SSAS’da ki veritabanını XMLA’e çeviren kod:

Bu metoda ilk değer olarak Analysis Services’in Server ismini, ikinci değer olarak da CREATE XMLA’ini oluşturacağımız veritabanı ismini vereceğiz.

public static string getCreateDatabasesXMLAOnProcessingS(string strServer, string strDatabaseName)
{
   XmlDocument doc = new XmlDocument();
   Microsoft.AnalysisServices.Server srv = new Microsoft.AnalysisServices.Server();
   String connstring = "Datasource=" + strServer + ";";
   srv.Connect(connstring);
   Microsoft.AnalysisServices.Database db = null;
   if ((srv != null) && (srv.Connected))
   {
     db = srv.Databases.FindByName(strDatabaseName);
   }
   else
   {
    throw new Exception("Couldn't get a connection to the processing server");
   }
   MajorObject[] mo = new MajorObject[1];
   mo[0] = db;
   Microsoft.AnalysisServices.Scripter s = new Microsoft.AnalysisServices.Scripter();
   XmlWriterSettings settings = new XmlWriterSettings();
   settings.OmitXmlDeclaration = true;
   StringBuilder builder = new StringBuilder();
   XmlWriter outputWriter = XmlWriter.Create(builder, settings);
   s.ScriptCreate(mo, outputWriter, true);

   srv.Disconnect();
   return builder.ToString() + "</ObjectDefinition></Create>";
}

Veritabanı XMLA'ini PROCESS ettirecek XMLA'i hazırlanayan kod:

Bu metod da girdi olarak, Analysis Services'daki Server adını, PROCESS XMLA'ini oluşturacağımız veritabanı adını ve process tipini gireceğiz. Ben genellikle "ProcessFull" veriyorum. Bu sayede küp her seferinde tam olarak işlenmiş olacaktır.
public static string getProcessDatabasesXMLAOnProcessingS(string strServer, string strDatabaseName, string processType)
{
  Microsoft.AnalysisServices.Server srv = new Microsoft.AnalysisServices.Server();
  String connstring = "Datasource=" + strServer + ";";
  srv.Connect(connstring);
  Microsoft.AnalysisServices.Database db = null;
  if ((srv != null) && (srv.Connected))
  {
    db = srv.Databases.FindByName(strDatabaseName);
    string databaseID = db.ID;
    string cubeID = db.Cubes[0].ID;
    string wrapperXMLA = "<Batch xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine\">";
    wrapperXMLA += "CUBESCRIPTHERE";
    wrapperXMLA += "<Parallel>";
    wrapperXMLA += "<Process xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:ddl2=\"http://    sc    hemas.microsoft.com/analysisservices/2003/engine/2\" xmlns:ddl2_2=\"http://schemas.microsoft.com/analysisservices/2003/engine/2/2\" xmlns:ddl1    0  0_100    =\  "http://schemas.microsoft.com/analysisservices/2008/engine/100/100\" xmlns:ddl200=\"http://schemas.microsoft.com/analysisservices/20    10/en  gine/20    0\" xmlns:ddl200_200=\"http://schemas.microsoft.com/analysisservices/2010/engine/200/200\" xmlns:ddl300=\"http://schemas.microsoft    .com/analysisservi    ces/2011/engine/300\" xmlns:ddl300_300=\"http://schemas.microsoft.com/analysisservices/2011/engine/300/300\">";
    wrapperXMLA += "";
    wrapperXMLA += String.Format("<Type>{0}</Type>", processType);
    wrapperXMLA += "<WriteBackTableCreation>UseExisting</WriteBackTableCreation>";
    wrapperXMLA += "</Process></Parallel></Batch>";
    return wrapperXMLA;
  }
  else
  {
    throw new Exception("Couldn't get a connection to the processing server");
  }
}

Yukarıdaki iki metodu da kullanarak veritabanın yaratacak (CREATE) ve işleyecek (PROCESS) XMLA'lerimizi hazırlamış oluyoruz. Ben her metodun geri dönüş değerli olarak string verdim böylece metodlar çalıştığı zaman bize geri string tipinde XMLA döndürecekler. Bu XMLA'leri ikinci adımda .CUB dosyasına veritabanını yerleştirmek için kullanacağız.

2. Adım: Dosya sisteminde *.CUB tipinde Offline bir küp oluşturulacak:

Bu metod da XMLA'lerini hazırladığımız veritabanını .CUB dosyasını yaratıp içersine ekliyoruz. Metod ilk olarak .CUB dosyasını oluşturacağı dosya yolunu alıyor, ikinci olarak PROCESS XMLA'ini ve üçüncü olarak CREATE XMLA'ini alıyor.

public static void GenerateOfflineCube(string OfflineCubePath, string WrapperXMLA, string CubeXMLA)
{
  AdomdConnection conn = new AdomdConnection();
  conn.ConnectionString = string.Format("Provider=MSOLAP;Data Source={0}", OfflineCubePath);
  try
  {
    conn.Open();
    AdomdCommand cmd = new AdomdCommand();
    cmd.Connection = conn;
    string xmlastub = WrapperXMLA;
    string xmlacube = CubeXMLA;
    /* replace the CUBESCRIPTHERE with actual script */
    cmd.CommandText = xmlastub.Replace("CUBESCRIPTHERE", xmlacube);
    /* this does the job */
    cmd.Execute();
    Console.WriteLine("ok");
  }
    catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
    finally
  {
    conn.Dispose();
  }
}

Bu son metodla da ihtiyacımız olan bütün methodları hazırlamış oluyoruz. Ben bütün bu methodları bir console programı içersinde demosunu hazırladım. Şu şekilde;

static void Main(string[] args)
{
   string databaseXMLA = String.Empty;
   string processXMLA = String.Empty;
   //Generate SSAS Database CREATE XMLA
   databaseXMLA = getCreateDatabasesXMLAOnProcessingS("CANKANSU", "OffLineCubeDemo");
   //Generate Process XMLA for given Database
   processXMLA = getProcessDatabasesXMLAOnProcessingS("CANKANSU", "OffLineCubeDemo", "ProcessFull");
   GenerateOfflineCube(@"C:\Users\can.kansu\Documents\Visual Studio 2012\Projects\OffLineCubeGenerator\Cube.cub",processXMLA,databaseXMLA);
   Console.ReadLine();
}

Bu metod kendini açıklayıcı şekilde, aynı yazımda bahsettiğim sırada ilk olarak CREATE XMLA'ini daha sonra PROCESS XMLA'ini ve en sonunda da bunları kullanrak .CUB dosyasını yaratım içersine veritabanını işliyor.

3. Adım: *.CUB'ı Excel kullanarak görüntülemek ve MDX sorguları çalıştırmak;
Eğer yukarıda verdiğim bütün kodları çalıştırırsanız elinizde Cube.CUB adlı bir dosya olacaktır. Bu dosyayı görüntülemenin en kolay yolu Excel kullanmaktır. Excel'i açıp Open diyere dosya tipinde AllFiles seçin ve .CUB uzantılı dosyanızı açın. Excel otomatik olarak bu dosyayı inceleyecek ve size aynı Analysis Services kübüne bağlandığınız gibi bir pivot table yaratacaktır. Artık istediğiniz analizi lokal kübünüz üzerinde yapabilirsiniz.

Sonuç olarak, hazırladığım bu program sayesinde bilgilerini verdiğim SSAS Veritabanını otomatik olarak lokal küp haline getirebilmek mümkün. Bu yazıma ilerki günlerde devam edeceğim ve bu programı Windows Form tipince cevirip yarattığımız lokal kübü sorgulamamızıda sağlayacağım.
Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s