Samstag, 30. April 2011

SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 2 – Connection Manager auslesen

Hier ist der nächste Teil meiner kleinen Reihe über die Entwicklung von eigenen Werkzeugen für das Auslesen und Verändern von SSIS Paketen (dtsx).

Wie bereits im ersten Teil, machen wir noch was ganz harmloses und lesen dieses Mal die Verbindungsmanager eines Paketes aus. Das Codebeispiel dient für den Moment hauptsächlich dazu, zu zeigen wie einfach der Zugriff auf einzelne Eigenschaften eines SSIS Paketes ist. Des Weiteren demonstriere ich noch, wie wir bereits hier auf die Verwendung von Expressions prüfen können. Expressions, also die Arbeit mit dynamischen Ausdrücken innerhalb einer SSIS Lösung, lassen äußerst mächtige Architekturen möglich werden, sind aber in der späteren Wartung ein wenig tricky, wenn der Verantwortliche für den Betrieb der Lösung nicht immer hundertprozentig weiß, wofür gerade überall Ausdrücke verwendet werden. Gerade im Zusammenspiel mit mehrstufigen Paket-Konfigurationen kann die Fehlersuche durchaus anspruchsvoll werden. Aber deswegen bauen wir uns ja einen eigenen Satz Werkzeuge, um später den Überblick zu behalten.

Hier das entsprechende Codefragment, welches wieder ein Paket öffnet und alle Verbindungen ausliest. Und über GetExpression wird auf die Verwendung der Eigenschaft ConnectionString geprüft.

app = new Microsoft.SqlServer.Dts.Runtime.Application();

DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
    p = app.LoadPackage(openFileDialog1.FileName, null); // Hier haben wir unser Paket in 'p'

    foreach (ConnectionManager ConMan in p.Connections)
    {
        listBox1.Items.Add(ConMan.CreationName + " - " + ConMan.ConnectionString);

        String ExConString = ConMan.GetExpression("ConnectionString");
        if (ExConString != null)
            listBox1.Items.Add("ConnectionString Expression -> "+ExConString);

    }

}

Donnerstag, 28. April 2011

SSAS (Analysis Services) OLAP Cubes – Der Stern ist nicht der Würfel!

Das Geschäft als Berater bzw. als Coach besteht ja auch zum Teil daraus, dass man zur richtigen Zeit den richtigen Spruch bzw. Lehrsatz auf den Lippen hat.

“Der Stern, die Schneeflocke oder die Galaxie ist nicht gleichzusetzen mit dem daraus entstehenden multidimensionalem Raum!”

Kurzfassung:

Der Stern ist nicht der Würfel!

Viele Anwender der Analysis Services arbeiten aber gerne mit der Vorstellung, dass das Starschema nicht nur die Quelle darstellt, sondern auch, dass im Cube die Trennung zwischen Dimensionen und Fakten existiert. Dimensions- und Faktentabellen sind aber “nur” relationale Strukturen, welche als Datenquellen für den Würfel dienen. Viele Frontends, wie auch Excel, unterscheiden aber sehr deutlich in der Darstellung zwischen Attributen (Dimensionen) und Measures. Der eigentliche Cube bzw. der, wie ich finde korrektere Ausdruck, multidimensionale Raum haben aber ihre ganz eigene “Logik”.

Wie kommen wir da jetzt raus?

Muss nun jeder Endanwender eine hochesoterische MDX Schulung erhalten? Bitte nicht! Das führt nicht gerade zur Akzeptanz einer Lösung!

Aber jeder, der sich für das Erstellen von OLAP Cubes mit den SQL Server Analysis Services interessiert, sollte frühzeitig in den “echten” multidimensionalen Raum einsteigen. Selbst wenn nie geplant ist mit MDX Berechnungen etc. pp. einzubauen, so ist das bloße Beschäftigen damit und Hinterfragen schon sehr nützlich, um auch die “einfachen” Funktionen von SSAS noch besser zu nutzen. Ehrlich!

Mittwoch, 27. April 2011

SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 1

In der Vergangenheit habe ich ja schon mehrmals auf die Möglichkeiten der “Developer Side of Microsoft Business Intelligence” hingewiesen. Häufig habe ich dabei auch die Erstellung bzw. Modifikation von SSIS Paketen durch .NET Code gestresst.

Ein Missverständnis dabei ist, dass ich diese Methode ausschließlich für die automatisierte Erstellung von SSIS Paketen (dtsx) empfehle! Der Aufwand, der dafür getrieben werden muss, um eine solche Lösung einzusetzen, ist tatsächlich sehr hoch und ist bei weitem nicht was für jedes Projekt.

Aber, meine Empfehlung ist die “Developer Side” auch für bestehende Lösungen zu nutzen. U. a. für die automatisierte Inventarisierung und Erweiterung von SSIS Paketen, um zum Beispiel Logging und Debug Funktionen. Dieser Ansatz ist gerade für Lösungen interessant, bei denen am Anfang auf die konsequente Verwendung von Templates aus einem Framework verzichtet wurde. Für diesen Verzicht kann es diverse Gründe geben. Häufig ist, dass einfach keine Zeit war und der Kunde möglichst schnell Resultate sehen wollte. Später dann alle Pakete manuell umzustellen wird dann auch wieder oft vermieden, weil der Aufwand auch dann wieder immens sein kann.

Daher habe ich mich entschlossen eine kleine Reihe von Artikeln zu veröffentlichen, um die Möglichkeiten der “Developer Side” für SSIS aufzuzeigen. Die Reihe startet mit diesen wenigen Zeilen Code, welche ein bestehendes SSIS Paket quasi per Knopfdruck um einen SQL Task inkl. Connection erweitern, um ein T-SQL Statement abzufeuern beim Start des Paketes. Das ist noch ein sehr einfaches Beispiel, aber zeigt schon erste wichtige Strukturen. Wir öffnen ein bestehendes Paket, modifizieren es und speichern es wieder.

Dieses Beispiel werde ich dann in den nächsten Wochen weiter verfeinern. Viel Spaß beim Mitmachen!

image

using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using wrap = Microsoft.SqlServer.Dts.Runtime.Wrapper;

Microsoft.SqlServer.Dts.Runtime.Application app;
Package p;

private void bAuswahl_Click(object sender, EventArgs e)
{
    app = new Microsoft.SqlServer.Dts.Runtime.Application();

    DialogResult result = openFileDialog1.ShowDialog();
    if (result == DialogResult.OK)
    {
        p = app.LoadPackage(openFileDialog1.FileName, null);

        ConnectionManager ConnManager = p.Connections.Add("OLEDB");
        ConnManager.Name = "Source"+tbDescription.Text;
        ConnManager.ConnectionString = tbConnString.Text;

        TaskHost th = p.Executables.Add("STOCK:SQLTask") as TaskHost;
        th.Name = tbDescription.Text;
        th.Description = tbDescription.Text;

        th.Properties["SqlStatementSource"].SetValue(th, tbSQL.Text);
        th.Properties["Connection"].SetValue(th, "Source" + tbDescription.Text);

        app.SaveToXml(openFileDialog1.FileName, p, null);
    }

Montag, 25. April 2011

SSIS (Integration Services) als ETL Lösung – Entscheidungen vor dem Einsatz

Heute mal wieder ein paar Gedanken zur Architektur einer ETL Lösung. Genaugenommen sind wir bei der Klärung von einigen grundlegenden Fragestellungen. Welche können das beim Einsatz von Integration Services (SSIS) als ETL Lösung sein?

Viele Fragestellungen bzw. Herausforderungen, welche ich im Rahmen von Coachings gestellt bekommen habe bzw. wir als Team in Projekten angetroffen haben, lassen sich auf einige grundlegende Missverständnisse und inkonsequente Entscheidungen zurückführen. Dabei geht es nicht um technische Details.

Ist tatsachlich die Entscheidung für eine echte ETL Lösung getroffen worden?

ETL heißt nicht, dass ein bestimmtes Tool verwendet wird! Also, wir verwenden die Integration Services heißt nicht automatisch, dass man da von ETL sprechen kann oder sollte. ETL ist für mich die konsequente Verfolgung eines Konzeptes. Und es heißt viel mehr als nur in Extract, Transform und Load zu denken, denn das trifft auch auf die meisten üblichen Schnittstellen zu.

ETL heißt u. a., dass alle Beteiligen sehr wahrscheinlich in Zukunft in Datenpaketen denken müssen. Und damit ist nicht gemeint, dass SSIS Task in Paketen organisiert werden, sondern “wieder” klassische Batchverarbeitung von Datensätzen angesagt ist. Aber nur mit diesen einfachen aber effektiven Methoden können Datenmengen in Enterprise Umgebungen auch nachhaltig bewältigt werden.

Ist jemand im Team, der schon mal ein echtes Data Warehouse gesehen hat?

Ok, provokant, aber leider eine berechtigte Frage! Denn mit Integration Services zu arbeiten heißt nicht, dass man später nur noch mit bunten Pfeilen Kästchen verbinden darf und alles andere ist dann von ganz allein im Lot. Viel zu häufig erlebe ich, dass die SSIS unterschätzt werden. Das grundlegende Konzept ist ja auch sehr einfach. Da kommt dann gerne mal im Workshop oder Proof-of-Concept viel zu schnell ein “Schnittstelle, verstanden, lassen Sie uns jetzt bitte mit diesen Würfeln weitermachen…”. Daher, da muss jemand ins Team, der das Ziel kennt.

Ist eine Entscheidung für den Einsatz des Datenflusstasks getroffen worden?

Was soll das denn jetzt? Der Datenflusstask ist doch das Herz der Integration Services! Korrekt, aber ich kenne einige sehr erfolgreiche und durchaus komplexe BI Projekte, welche komplett auf den Datenfluss Task verzichtet haben. Warum? Ja, weil einfach die Anforderung für den Einsatz fehlte. Zwar wurde der Bewirtschaftungsprozess komplett in SSIS gekapselt, aber es wurden konsequent SQL Statements für die Verarbeitung der Daten eingesetzt.

Den Datenflusstask einzusetzen heißt, dass sich das Team bewusst dazu entscheidet ab sofort neben einem “Thinking in Sets” (ja, ich meine damit auch das Buch von Joe Celko) mit der Prämisse “Thinking in Rows” zu leben. Den Datenflusstask einzusetzen heißt auch eine nicht unerhebliche Lernkurve mitzumachen.  Dann hat das Team eine äußerst leistungsfähige Technologie zur Hand, um wirkliche Massendaten bei jedem Lauf des Prozesses zu bewegen. Wenn es aber wie so häufig um wenige 100.000 Sätze pro Tag geht, dann sollte vorher entschieden werden, ob sich der Aufwand beim Einsatz lohnt. Wichtig ist mir hier der Hinweis, dass es da kein Richtig oder Falsch gibt! Es gilt immer die Fallentscheidung.

Sind die politischen Aspekte eines solchen Projektes klar?

Natürlich ist jedes Projekt irgendwie politisch. Wer kennt das Spiel um die Förmchen und Schäufelchen nicht aus eigener Erfahrung. ETL Projekte, also wenn wir von einem echten sprechen (s.o.), sind anders, denn hier nehmen wir allen den Sand aus dem Sandkasten weg, um ihn erst mal richtig gut durchzuwaschen, zu sieben und dann färben wir den Sand auch der Größe der Körner nach ein. Und dann wird auch noch entschieden wer ab sofort mit dem blauen, roten und grünen Sand spielen darf. Vielleicht werden im Zuge des Projektes auch noch die liebgewonnen Eimer und Siebe standardisiert. Mit diesem Bild vor Augen sollte jedem die Situation und Herausforderung klar sein, in die er sich da begibt. Mein Ratschlag: Nehmen wir viele Lollies mit, welche dann vom Business Intelligence Competence Center verteilt werden sollten. Nicht ohne Grund ist die Gründung eines BICC häufig ein Teil eines ETL/DWH Projektes, um den Anwendern das Ganze schmackhaft zu machen.

Samstag, 23. April 2011

Integration Services & Reporting Services gemeinsam für die Bereitstellung von Reports nutzen

Im Rahmen eines Projektes evaluiere ich gerade Möglichkeiten, um eine automatisierte Bereitstellung von Reports zu ermöglichen. Es geht dabei um 1-2 Reports mehr. :-)

Die Verwendung von RS.EXE für die Ansteuerung der Reporting Services hatte ich in diesem Kontext ja schon beschrieben. Wobei mir bei RS.EXE die Anbindung von Datenquellen für die Parametrisierung nicht so gefällt.

Daher heute ein weiterer Ansatz: Nutzung der Reporting Services aus den Integration Services heraus!

Von der Logik her unterscheidet sich der Weg zum Report gar nicht so sehr vom Skriptingansatz, da wir wieder mit den selben Objekten konfrontiert werden. Nur jetzt verwende ich mal den Webservice für die Kommunikation.

Was brauchen wir also alles?

Einen Report! Da nehme ich wieder mal meinen einfachen Report mit nur einem Parameter, um die Ansteuerung der Parameter zu testen.

image

Ein SSIS Paket, welches nur aus einem Datenflusstask besteht, welcher wiederum nur eine OLE-Quelle und ein Skriptkomponente hat, welche heute mal als Ziel herhalten muss.

image

Die Datenquelle hat ein vergleichsweises einfaches Design, aber wird ihren Job machen.

image

Die Eingabespalte für unsere Skriptkomponente ist einfach “Text”. Mehr Einstellungen braucht die Komponente auch nicht.

image

Hier der Verweis auf den Webdienst der Reporting Services. Ab 2008 können wir ja auch Webdienste in der Komponente ansteuern. Danke nochmals dafür! :-)

image

Und natürlich noch das Stück Code für die Skriptkomponente.

public override void Eingabe0_ProcessInputRow(Eingabe0Buffer Row)
{
    byte[] result = null;
    string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
    string encoding;
    string mimeType;
    string extension;
    Warning[] warnings = null;
    string[] streamIDs = null;

    ParameterValue[] parameters = new ParameterValue[1];
    parameters[0] = new ParameterValue();
    parameters[0].Name = "DemoParameter";
    parameters[0].Value = Row.Text; // Übergabe des Parameters von außen…

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

    rs.LoadReport("/Vertrieb/Demo", null);
    rs.SetExecutionParameters(parameters, "de-de");

    result = rs.Render("PDF", devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

    FileStream stream = File.Create(@"c:\MyProjects\output\report_"+ Row.Text +".pdf", result.Length);
    stream.Write(result, 0, result.Length);
    stream.Close();
}

So, diese Teile alle in einem SSIS Projekt bringt dann folgenden Output:

image

Und als Beweis kurz noch der Blick in eines der Dokumente.

image

Damit bin ich jetzt schon eindeutig zufriedener, wenn es darum geht automatisiert eine größere Menge an Reports zu erzeugen. Der Ansatz scheint eine gute Grundlage zu sein.

Viel Spaß beim Nachmachen! Und nochmals FROHE OSTERN! :-)

Donnerstag, 21. April 2011

Reporting Services RS.EXE mit Parametern nutzen

Vor ein paar Tagen habe ich hier gepostet wie Ihr mit dem Tool RS.exe (dem Reporting Services Skript Tool) einen Report bereitstellen könnt.

Dazu kamen nun ein paar Fragen rein. Eine Frage wiederholte sich und zwar: Wie Parameter an den Report übergeben werden können?

Das ist natürlich möglich, dazu müssen wir nur das Skript ein wenig erweitern für. Dann könnt Ihr das gleich zu Ostern ausprobieren! :-)

Zu erst aber brauchen wir einen Report mit einem Parameter. Dazu nehmen wir mal nichts komplexen, sondern diesen schönen Report. Der hat keinerlei Quellen etc., sondern nur einen Parameter mit dem schönen Namen “DemoParameter”.

image 

Kommen wir zum Inhalt unseres “render.rss” Skripts.

Public Sub Main()
  Dim fileName as String = "C:\Users\Administrator\Desktop\demo.png"
  Dim reportPath as String = "/Vertrieb/ParameterDemo"
  Dim results() as Byte

  Dim parameters(0) As ParameterValue

  parameters(0) = New ParameterValue()
  parameters(0).Name = "DemoParameter"
  parameters(0).Value = myText

  rs.Credentials = System.Net.CredentialCache.DefaultCredentials

  rs.LoadReport(reportPath, Nothing)
  rs.SetExecutionParameters(parameters,"en-us")
  results = rs.Render("IMAGE",  Nothing, Nothing, Nothing, Nothing,  Nothing, Nothing)
  Dim stream  As FileStream = File.OpenWrite(fileName)
  stream.Write(results, 0, results.Length)
  stream.Close()
End Sub

Hier sehen wir auch die Erweiterungen für die Arbeit mit Parametern. Wir nutzen ein Array vom Typ ParameterValue und übergeben dieses mittels “SetExecutionParameters()” an den Report. Nur kommt unser Parameter nun von außen in das Skript?

Dazu hier unsere Kommandozeile:

rs.exe –i render.rss –s http://localhost/ReportServer –e Exec2005 –v myText=”Hallo SQL Server Community…”

Mit dem Parameter “–v” legen wir eine globale Variable im Skript an, welche wir nutzen können. Siehe oben im Skript. Das war es schon!

Frohe Ostern!

ShareCamp 2011 in München, Unterschleißheim (Microsoft)

Hier noch schnell vor Ostern der erste Hinweis, dass wir (die PSG) gemeinsam mit unserem Partner Layer2 auf dem ShareCamp, dem Community Event für SharePoint in Deutschland, dabei sind.

Das ShareCamp 2011 findet auch dieses Mal wieder in der Zentrale von Microsoft in Unterschleißheim statt. Termin ist der 14.-15.05.2011 (ja, das ist ein Wochenende!).

Vor Ort werde u. a. ich sein und ein wenig die Business Intelligence Flagge für SharePoint hochhalten und die Integration von Analysis Services, Reporting Services etc. in SharePoint evangelisieren. Dazu gehört es natürlich auch, dass ich gerne die PerformancePoint Services erläutere und einen tiefen Einblick in die Technologie OLAP (so mit Dimensionen, Attributen, Tuples, MDX etc. pp.) gebe, um die PPS auch wirklich sinnvoll nutzen zu können.

Ich freue mich schon sehr auf dieses Community Event! In den nächsten Tagen werde ich noch weitere Details dazu posten und was ihr von uns vor Ort sehen könnt.

Mittwoch, 20. April 2011

SQL Server Community Vorträge in Hannover & Köln

Wie die Zeit doch rennt! :-)

Hier der Hinweis, dass ich als Gastsprecher am

12.05.2011 beim Treffen der PASS Deutschland e.V. Gruppe Hannover / Göttingen

& am

16.05.2011 beim Treffen der PASS Deutschland e.V. Gruppe Köln / Bonn / Düsseldorf

bin!

Ich werde bei beiden Treffen über eines meiner Lieblingsthemen sprechen dürfen und zwar

The Developer Side of Microsoft Business Intelligence
Der Microsoft SQL Server bietet eine ganze Reihe von äußerst mächtigen Diensten und Werkzeugen für die Erstellung von Business Intelligence Lösungen. Warum sollte sich dann überhaupt ein BI Berater mit den Möglichkeiten der Programmierbarkeit des SQL Servers beschäftigen? Weicht er damit nicht vom Standard ab? Und warum sollte sich ein Programmierer mit BI befassen? Sind die BI relevanten Dienste vom SQL Server etwa nicht fertig?

Die Wahrheit ist, dass eine wesentliche Stärke des SQL Servers, neben den bekannten Werkzeugen, die Verfügbarkeit von diversen sehr gut dokumentierten APIs ist. Diese APIs können sehr gut im Rahmen von BI Projekten genutzt werden und die Integrationsfähigkeit einer BI Lösung um ein vielfaches erhöhen. Alle in diesem Workshop vorgestellten Schnittstellen sind offiziell von Microsoft beschrieben worden und werden in zukünftigen Versionen unterstützt werden.

Vor dem Einsatz von Technologie kommt aber immer die zielgerichtete Konzeption der Lösung. Es wird gezeigt, wann und wie sich der Einsatz von Programmierung in BI Projekten tatsächlich rechnet und welche Voraussetzungen dafür erfüllt sein müssen.

Ein ganz wesentlicher Punkt aus der Erfahrung heraus ist die Nutzung der Abstraktion der Anforderungen und der Technologie als Architekturansatz im Design von Business Intelligence Lösungen.

Zwar geht der Vortrag bei einigen Punkten ein wenig ins Eingemachte, aber auch SQL Server BI Rookies werden eine Menge mitnehmen können. Versprochen!

Ich freue mich schon sehr auf die Treffen und die Chance möglichst viele SQL Server Interessierte und Community-Begeisterte aus der jeweiligen Region kennenzulernen!

Dienstag, 19. April 2011

SQL Server Analysis Services & Excel – “Bewegliche Ziele” oder wie wichtig ist eigentlich ein deterministischer Attribute Key?

Ein Thema kam beim letzten Treffen der SQL Server Community (PASS) in Hamburg auf und zwar die Frage: Wie wichtig ist die deterministische Vergabe des Attribute Keys in Analysis Services?”. Nun ja, und die Antwort darauf ist wie so oft: Kommt ganz drauf an!

Was ist überhaupt gemeint mit der deterministische Vergabe von Attribute Keys?

Am Beispiel von Excel 2010 als Frontend möchte ich kurz die Herausforderung skizzieren.

In Excel 2010 können wir ohne weitere Plug-Ins mittels einer Pivot-Tabelle und/oder den Excel Cube Funktionen auf Analysis Services Datenbanken (aka “Cubes”) zurückgreifen. Und Excel gibt es mittlerweile sowohl als Tool für den Desktop als auch als Excel Services im SharePoint.

Für unser kleines Beispiel habe ich hier eine Tabelle DimKunde mit folgenden Einträgen:

image

Wichtig dabei ist, dass die Dimensionszeile einen eindeutigen Schlüssel mit der Spalte ID hat. Die Spalte OrtId wird in diesem Fall automatisch erzeugt und enthält damit einen eindeutigen Key für jedes Member des Attributes. Das automatische Erzeugen machen wir zum Beispiel mit dem Ansatz aus meinem Blogpost über DENSE_RANK(). Die Vergabe der OrtId erfolgt immer direkt bei der Aufbereitung der Analysis Services Datenbank. Vielleicht ist da ja ein View oder ähnliches zwischengeschaltet.

image

Wir setzen die “KeyColumns” Eigenschaft des Attributes in Analysis Services (also im BIDS) auf OrtID und die “NameColumn” auf Ort.

image

Damit nun die Member nicht in der Reihenfolge der Schlüssel angezeigt werden, setzen wir noch die Eigenschaft “OrderBy" auf “Name”.

image

Und eine kleine Hierarchie darf auch nicht fehlen.

image

Damit bekommen wir folgende Dimension:

image 

Natürlich gibt es noch Fakten dazu, aber darauf gehen wir hier mal nicht im Detail ein. :-)

Und schon können wir uns unsere multidimensionale Datenbank in Excel darstellen lassen. Nicht viel dran mit einer Dimension und einer Faktentabelle, aber es reicht für den Moment.

image

Nun filtern wir in Excel die Darstellung so, dass nur noch Umsätze für Hamburg angezeigt werden sollen:

image

Noch schnell eine Überschrift drüber und schon ist ein einfacher “Report” fertig, wie er wahrscheinlich in etwas komplexerer Form in zahllosen Unternehmen tagtäglich erstellt wird. Den könnten wir nun gut abspeichern und später wieder nutzen, wir haben ja nun unsere Umsätze für Hamburg “herausgefiltert”. Nützlich so etwas und kann auch gerne dem Management zur Verfügung gestellt werden.

 image

Nun kommt der Tag, an wir einen weiteren Kunden dazu bekommen. Kein Problem, der bekommt ja sofort eine eindeutige ID zugeordnet. Aber, bei der täglichen Vergabe der OrtId ist nun auf einmal das Member “Essen” zwischen “Berlin” und “Hamburg” gerückt und bekommt damit die automatische OrtId “2”. 

image

Wenn wir uns nun die erweiterte Dimension anschauen, dann ist die korrekt ergänzt worden. Sieht alles unverdächtig aus!

image

Aber wenn wir nun unser gespeichertes Excel Dokument anschauen und mittels Aktualisieren die Darstellung aktualisieren, dann haben wir auf einmal folgendes in unserem “Report” stehen:

image

Was ist denn jetzt passiert? Ganz offensichtlich speichert Excel den Key des Members ab. Und sobald wir aktualisieren, wird aus Hamburg Essen, da nun Essen die OrtId “2” hat. Ein solches Verhalten von auf Excel basierenden Reports wird sehr wahrscheinlich das Vertrauen der Endanwender in die Business Intelligence Lösung nicht unbedingt festigen!

Wie schaust mit den Excel Cube Funktionen aus? Hierzu legen wir in Excel ein Beispielszenario an:

  image Dieses kleine Beispiel basiert auf folgenden Formeln:

image

Der obere Wert verwendet den Key “&[2]”. Der untere Wert bezieht sich direkt auf den Namen des Members “Hamburg”. Nach der Erweiterung um unseren Kunden in Essen, sieht unser Excel Dokument nun so aus:

image

Der obere Wert hat sich geändert auf den Wert von Essen, der untere ist erhalten geblieben. Wobei nun gesagt werden muss, dass die Funktion in C7 mit dem Standardverhalten von Excel erstellt wurde.

Fragestellung ist nun: Wie kommen wir da jetzt nur raus?

Es bleiben uns drei Varianten:

1.) Wir verwenden keine extra Key Columns und nutzen den hoffentlich einmaligen Namen des Attributes. Ok, dann geht die Performance sehr wahrscheinlich recht bald den Bach runter, aber irgendwas ist ja immer… (mal im Ernst, damit kommen wir nicht weiter..)

2.) Wir sagen den Anwendern, dass sich unser BI auf magische Weise über Nacht verändern kann und sie bitte auf den einen oder anderen Client verzichten sollten. (ok, ist auch nix… sehe ich ja ein…).

3.) Wir investieren wesentlich mehr Zeit in die Datenbewirtschaftung und sorgen dafür, dass die Schlüssel der Attribute deterministisch sind! (bin offen für Punkt 4, 5 etc…)

Also, sobald unser SSAS Projekt den Status Proof-of-Concept oder Prototyp verlässt und tatsächlich von den Anwendern produktiv eingesetzt wird, müssen wir uns mit dieser Thematik auseinandersetzen. Einen Ansatz dazu hatte ich schon mal kurz angerissen und zwar die Verwaltung der Dimensionen in Key-Value-Tabellen erfolgen zu lassen. Auf den ersten Blick scheint dieser Ansatz unnötig kompliziert, aber er hat einige Vorteile. Einen zeigt dieser Artikel, da in den Key-Value Tabellen die Schlüssel für die Attribute bereits gepflegt werden. Damit umgehen wir die Herausforderung der “spontanen deterministischen” Vergabe! :-)

Samstag, 16. April 2011

SQLBits 8 – Analysis Services Scale-Out Vortrag PowerPoint ist online

Mittlerweile ist der Download für die PowerPoint Folien für meinen Scale-Out für Analysis Services aktiv. In der Regel dauert es ein paar Wochen bis auch die Videoaufzeichnungen der Vorträge online gehen. Geduld! :-)

Die Slides bekommt Ihr hier!

Donnerstag, 14. April 2011

Reporting Services Skripte nutzen für die Bereitstellung von Reports

Hier aktuell eine Notiz aus dem Feld zu den Reporting Services.

Vielen Kunden als auch Kollegen ist es nicht bekannt, dass die Reporting Services auch auf sehr einfache Art und Weise per Skript-Sprache genutzt werden können. Daher hier ein kleines Beispiel dazu.

Den SQL Server Reporting Services liegt ein Kommandozeilentool namens RS.EXE bei. Dieses kann sowohl für administrative Aufgaben als für die Bereitstellung von Reports genutzt werden. Gerade das Skript (Batch) gesteuerte Erstellen von Reports in einem der Exportformate (z. B. PDF, XLS, DOC… ) ist für viele Kunden attraktiv. Wie kann so etwas umgesetzt werden?

Es wird auf jeden Fall eine RSS Datei benötigt! RSS steht in diesem Fall für Reporting Services Script. :-)

Hier der Inhalt einer Datei mit dem Namen “process.rss”, welche ich mit Notepad erstellt habe. Wie man sieht, ist das Ganze ein VBA Dialekt. Dieses einfache Beispiel rendert einen Report im PDF Format, für den das RDL File auf dem Report Server im Pfad “/Vertrieb/Demo” liegt. Das PDF wird direkt auf einem Fileshare im Pfad “f:\output\demo.pdf” erzeugt.

Public Sub Main()
  Dim fileName as String = "f:\output\demo.pdf"
  Dim reportPath as String = "/Vertrieb/Demo"
  Dim results() as Byte

  rs.LoadReport(reportPath, Nothing)

  results = rs.Render("PDF",  Nothing, Nothing, Nothing, Nothing,  Nothing, Nothing)

  Dim stream  As FileStream = File.OpenWrite(fileName)
  stream.Write(results, 0, results.Length)
Exec  stream.Close()
End Sub

Ausgeführt wird dieses kleine Skript mit folgender Kommandozeile:

rs.exe –i process.rss –s http://localhost/ReportServer –e Exec2005

Diese kann entweder direkt oder als Teil eines Batches und/oder zeitgesteuert ausgeführt werden. Allein schon mit diesem einfachen Skript lassen sich eine ganze Menge von Anforderungen in komplexeren Projekten “erschlagen” ohne extra dafür ein Tool in .NET zu erstellen! Wobei, ich mag ja .NET…

Viel Spaß beim Ausprobieren!

Mittwoch, 13. April 2011

Analysis Services Synchronisieren von Cubes – Wer bleibt online? (Coaches’ Hell)

Vor ein paar Tagen habe ich ja über das Synchronisieren von Cubes einen kleinen Artikel geschrieben und einen Webcast augenommen. Auf den SQLBits in Brighton hatte ich das Thema auch in meiner Session dabei.

Ein Feedback dazu erreichte mich in den letzten Tagen immer wieder: Bleibt da alles online? Bleiben alle Connections erhalten?

Dazu von mir der Hinweis: Nein, der “Target”, also die Analysis Services Instanz, welche die Synchronisation auslöst, bricht laut meiner Erfahrung die bestehenden Connections ab und braucht einen Re-Connect.

Montag, 11. April 2011

SQL Server Usergroup Treffen in Hamburg April 2011 (Analysis Services Interna)

Und schon wieder ist ein Monat rum und die Hamburger SQL Server Szene trifft sich am Donnerstag, den 14. April 2011, 18:30-20:30.

Das ist dann unser 60. Treffen! Wow…

Im April geht es um Interna in den SQL Server Analysis Services. Wir werfen gemeinsam einen Blick hinter die Kulissen der multidimensionalen Datenbank. Sowohl für den BI Berater als auch für den DBA interessant.

Sicherlich finden wir auch noch die Zeit, um uns ein wenig über die gerade vergangene SQLBits Konferenz in UK auszutauschen.

Veranstaltungsort ist:

Deutscher Pressevertrieb, Düsternstraße 1, 20355 Hamburg
Ansprechpartner vor Ort: Wolfgang Gottschalk

Würde mich sehr freuen, möglichst viele von Euch dort zu treffen! :-)

SQLBits 8 - Resümee

So, die SQLBits 8 Konferenz ist nun vorbei. Zeit für ein letztes umfassendes Resümee!

Super Sprecher!

Super Lokation!

Super Community Event!

Und die SQLBits haben es sogar bis in die deutschen Nachrichten geschafft. Golem berichtet über sie, wenn auch leicht versteckt, beim zitieren eines Interviews mit Steve Wozniak (Mitgründer von Apple). http://www.golem.de/1104/82675.html Der Hinweis, dass es sich um die größte europäische SQL Server Konferenz handelt wäre noch nett gewesen.

Des Weiteren tauchen immer mehr Videos auf youtube auf. Unter anderem dieses hier… und ja, es war früh am Morgen… :-)

 

Sonntag, 10. April 2011

Attribute Keys für Analysis Services optimieren mit Hilfe von Dense_Rank (Coaches' Diary)

Vor einigen Tagen habe ich einen Tipp veröffentlicht mit dem herausgefunden werden kann welche Attribute innerhalb einer SSAS Dimension einen String als Key haben. Das gilt es ja in einem SSAS Projekt aus diversen Gründen (einer ist Performance und ich glaube der zweite Grund war Performance, auf den Dritten komme ich noch…) zu vermeiden.

Nun kam die Frage auf, wie denn nun mit einfachen Mitteln dafür gesorgt werden kann, dass denn ein Integer Key auch immer verfügbar ist für das Attribut? Sofern das nicht über die Datenbewirtschaftung eines Data Warehouses gelöst wird (größeres Projekt…), dann muss das halt beim Aufbereitungsprozess für das Star-Schema eines “Cubes” (ich spreche ja eigentlich immer von SSAS Datenbanken) passieren.

Häufig sind diese Aufbereitungsprozesse aber direkt an das Quellsystem gebunden und die Aufbereitung wird über Sichten (Views) realisiert. Wo ist da noch Platz für die Zuordnung von Integer Keys? Diese Herausforderung habe ich in der Praxis schon häufig vorgefunden und damit auch eine ganze Reihe von Lösungen, welche sich der jeweilige Kunde dazu überlegt hatte. Da wird mit gespeicherten Prozeduren gearbeitet, da werden Tabellen umkopiert und mit Update-Statements aufgefüllt und natürlich spielt das Distinct Argument dabei häufig eine wichtige Rolle, um überhaupt die eindeutigen Werte des Attributes zu finden.

Hier möchte ich einen Lösungsansatz zeigen, welchen ich gerne verwende. Dazu nutze ich eine sogenannte Fensterrangfunktionen. Und zwar: DENSE_RANK(). Was steht zu dieser Funktion in den BOL?

“Gibt den Rang von Zeilen innerhalb der Partition eines Resultsets ohne Lücken in der Rangfolge an. Der Rang einer Zeile ist 1 plus die Anzahl der Ränge vor der fraglichen Zeile.”

Ok, klar! Also genau was wir brauchen, oder? Nun ja, der Sinn und ganz besonders der Nutzen erschließt daraus nicht auf den ersten Blick. Daher ein Beispiel.

Nehmen wir von der guten alten AdventureWorks2008R2 die Dimension DimProduct. In dieser Dimension gibt es eine ganze Reihe von Attributen für welche nur Keys als String bereitstehen. Zum Beispiel Color und es ist recht wahrscheinlich, dass unsere Anwender nach Color den Cube schneiden wollen. Also muss eine Optimierung des Schlüssels her.

image

Nur wie kommen wir jetzt mit ohne Umweg an einen eindeutigen Integer Key für Color? Hier ein erstes Beispiel für DENSE_RANK().

select
color,
DENSE_RANK() OVER (ORDER BY COLOR) as Color_Key
from dbo.DimProduct;

Hier nutzen wir die Rangfunktion, um für die Spalte Color den Rang für jeweils eine sogenannte Partition zu ermitteln. Diesen Rang nennen wir Color_Key. Natürlich geht das nicht nur mit einem Attribute in einer Abfrage, sondern auch mit weiteren Attributen!

select
*,
DENSE_RANK() OVER (ORDER BY COLOR) as Color_Key,
DENSE_RANK() OVER (ORDER BY SIZE) as Size_Key,
DENSE_RANK() OVER (ORDER BY SizeRange) as SR_Key
from dbo.DimProduct;

Wir sehen, dass wir in unsere Abfrage ohne weiteres eine Funktion einbauen können, welche uns für unsere Attribute die “notwendigen” Keys liefert. Damit kann also ohne größeren Umweg oder Aufwand unser Analysis Services Cubes optimiert werden.

image Viel Spaß beim Ausprobieren!

Freitag, 8. April 2011

SQLBits 8 – Brighton, UK - Freitag

So, der Freitag in Brighton neigt sich dem Ende. Und selten wurde ein Motto so konkret umgesetzt: Beside the seaside…

Die letzten Partygäste verlassen das Haus. Auf der Ausklang Party gab es u.a. Fish & Chips und ein kühles Wetter, was bei dem Wetter hier auch dankend angenommen wurde! Wobei englisches Essen polarisierte schon ein wenig bei den nicht-englischen Teilnehmern.

Meine Session “28 weeks later – How to scale-out your MS Business Intelligence environment ”verlief weitestgehend wie erwartet und ohne größere Probleme. Es waren trotz prominenter “Konkurrenz” erstaunlich viele Teilnehmer bei so einem recht speziellem Thema im Raum. Vielen Dank dafür!

Und es waren dieses mal deutlich mehr Teilnehmer aus Deutschland dabei.

Bin schon sehr gespannt wohin es die SQLBits 9 dann wohl verschlagen wird… nur das Königreich steht schon fest! :-)

GEDC0732  GEDC0717GEDC0735  GEDC0734 GEDC0730

Mittwoch, 6. April 2011

SQLBits 8 in Brighton/UK – Morgen geht es los!

Und schon wieder ist es soweit! Morgen startet in Brighton, UK die wohl größte europäische SQL Server Konferenz! Wie immer haben die Organisatoren einen schönen Ort in England ausgesucht. Die Konferenz findet dieses mal im “The Grand” in Brighton statt. Hier mal eine Impression. Allein deswegen wird sich wohl der Weg lohnen.

image

Am Freitag bin ich ja dann als Sprecher dabei und darf als “quasi” Fortsetzung zum “The Developer Side of Microsoft Business Intelligence” einen Vortrag über Scale-Out Projekte mit den SQL Server Analysis Services halten. Mein Vortrag heißt dieses mal “28 Weeks later - How to scale-out your MS Business Intelligence Environment”. Spannendes Thema, hoffentlich finden das die Teilnehmer auch.

Hier eine kleine Vorschau auf das Slidedeck.

image  image

Vieleicht treffe ich ja dieses mal mehr Deutsche (oder zumindest deutschsprachige) Teilnehmer der SQL Server Community als in York! Würde mich sehr freuen!