Samstag, 13. November 2010

PASS Summit, TechEd & TechNet… was für eine Woche!

Wow, das war doch mal eine Woche! Da gab es endlich wieder etliche Überschneidungen im Kalender.

Wir hatten den PASS Summit in Seattle, die TechEd Europe in Berlin und noch ein TechNet MS SQL & BI Seminar in Hamburg.

Die Keynotes des Summits gabs auch gleich noch als Livestream. Sessions der TechEd sind wie gewohnt bereits online verfügbar.

Sowohl auf dem Summit als auch auf der TechEd wurden diverse Ankündigungen bzgl. des neuen SQL Servers gemacht. Highlights sind wohl u. a.:

  • Project Crescent (ultra cooles Reporting / Dashboard Tool auf Basis Silverlight)
  • Business Intelligence Semantic Model (BISM)
  • VertiPaq in der relationalen Welt (eine Renaissance von ROLAP ?)
  • und vieles, vieles mehr…

Und es gab dazu viele Emotionen diese Woche.

Chris Webb z. B. sprach da wohl vielen von uns aus der Seele.

http://cwebbbi.wordpress.com/2010/11/11/pass-summit-day-2/

Da wurde wohl das eine oder andere ein wenig zu euphorisch angekündigt und präsentiert. Zumindest entstand bei einigen der nachhaltige Eindruck, dass das klassische UDM keine große Zukunft mehr hat. Das Gerücht, dass MDX tot sei und DAX nun für alles herhalten muss entstand. Microsoft hat (fast schon ungewohnt) schnell auf diese Gerüchte reagiert.

Selbst Amir Netz hat den Post von Chris mit einem Kommentar bedacht. Müsst Ihr ein wenig nach unten blättern.

Als Antwort an Alle, die nun ähnliche Bedenken haben, was die Zukunft von UDM, MDX, OLAP & Co ist, hat das SQL Server Team (namentlich T.K. Anand) nun folgenden Post verfasst:

http://blogs.technet.com/b/dataplatforminsider/archive/2010/11/12/analysis-services-roadmap-for-sql-server-denali-and-beyond.aspx

Kurzfassung: BISM soll UDM (OLAP) nicht ersetzen! Wir werden noch viele weitere Jahre (Releases) unseren Spaß und Freude mit MDX & Co haben können. Sofern natürlich gewünscht, da wir alle (also mal so als BI Pro an BI Pro) dem BISM und DAX eine Chance geben sollen. Ich für meinen Teil bin auf jeden Fall neugierig auf diese weitere Seite von MS BI und werde sie darauf gehend prüfen, ob sie weitere Bemühungen hinsichtlich einer umfassenden Repository Umgebung überflüssig machen wird. Bin ja bekanntlich ein Fan von Repositories für die Vereinfachung und Steuerung von komplexeren DWH und BI Umgebungen. Schauen wir mal, es bleibt weiterhin Spannend! 

Wo wir gerade bei DAX sind. Da war ja auch noch das TechNet Seminar in Hamburg. Thema war “Managed Self-Service Business Intelligence mit …” aktuellen Bits und Bytes. Mein Job während dieser Tagesveranstaltung in der Hamburger MS Niederlassung war eine zweistündige recht technische Session über das aktuelle PowerPivot in Excel und SharePoint. Hat mir auf jeden Fall viel Spaß gemacht unsere (PSG) Erfahrungen mit dieser Technologie an Kunden & Partner weiterzugeben.

Im Anschluss an das TechNet Seminar fand bei Microsoft auch noch das monatliche Treffen der Hamburger SQL Server Community (PASS) statt. Vielen Dank an MS für den Raum, den Sprecher (Frank) und das Catering!

Donnerstag, 4. November 2010

MDXScript Object in Analysis Management Objects (AMO)

Eine Frage kommt im Zusammenhang mit den Analysis Management Objects immer wieder: Wie kann auf das MDX Skript zugegriffen werden?

Und auch dafür sind tatsächlich nur wenige Zeilen Code notwendig! AMO sei Dank!

Mit diesem Codeschnipsel lese ich das MDX Skript aus und zeige ihn in einer Textbox an. Statt der Textbox könnt Ihr natürlich auch eine Variable oder sonst was verwenden.

using Microsoft.AnalysisServices;

Server srv = new Server();

srv.Connect("localhost"); // Dein Server Name!

myTB.Text = srv.Databases.GetByName("Adventure Works DW 2008").Cubes.GetByName("Adventure Works").MdxScripts[0].Commands[0].Text; // Deine SSAS DB & Dein Cube

srv.Disconnect();

So, und natürlich kommt auch gleich wieder die Frage wie denn nun das MDX Skript geschrieben werden kann? Mit dem BIDSHelper ist es ja möglich dies innerhalb des Business Intelligence Development Studios (BIDS halt) zu machen.

Auch hierfür sind nur wenige Zeilen Code notwendig. Also genaugenommen brauche ich dazu nur eine weitere Zeile.

using Microsoft.AnalysisServices;

Server srv = new Server();

srv.Connect("localhost");

srv.Databases.GetByName("Adventure Works DW 2008").Cubes.GetByName("Adventure Works").MdxScripts[0].Commands[0].Text = myTB.Text;

srv.Databases.GetByName("Adventure Works DW 2008").Cubes.GetByName("Adventure Works").MdxScripts[0].Update();  // Wichtig! Hiermit wird das “kurz” mal aktualisiert.

srv.Disconnect();

Die Bereitstellung des MDX Skriptes geht äußerst schnell. Probiert es einfach mal aus!

Samstag, 30. Oktober 2010

LastProcessed Status einer Cube Partition mittels SSIS auslesen

Als ein Feedback auf meine letzten Casts bekam ich die Nachfrage, ob und wie denn der LastProcessed Status einer SSAS Cube Partition mittels der SSIS Skriptkomponente und Analysis Management Objects ausgelesen werden kann. Als Antwort darauf habe ich wieder einen kleinen Cast aufgenommen. Ich hoffe alle wesentlichen Schritte sind klar und verständlich geworden.

Viel Erfolg damit!

Mittwoch, 27. Oktober 2010

SSIS Skriptkomponente als Datenquelle verwenden für z. B. AMO, MDX Queries etc.

Aufgrund des Feedbacks zum Post über meine AMO Aktivitäten für den Aufbau eines Microsoft Business Intelligence Repositorys, habe ich wieder einen kleinen Webcast aufgenommen. In diesem zeige ich die Verwendung des SSIS Skripttasks als Datenquelle für Analysis Management Objects oder auch MDX Abfragen. Des Weiteren zeige ich auch wie Ihr Euch mit SSIS Test- bzw. Demodaten erzeugen könnt.

Viel Erfolg beim selbst ausprobieren!

 

Sonntag, 24. Oktober 2010

Analysis Services Metadaten mittels AMO in einem SSIS Task auslesen

Kurze Rückmeldung von mir. Bin vom PASS Camp 2010 R2 zurück. Meine Session lief wohl soweit erfolgreich. Das Camp als Ganzes war aus meiner Sicht ein voller Erfolg! Details dazu werden noch folgen!

Bin an der weiteren Integration eines umfassenden Repositorys für die Microsoft BI Umgebung. Ein Aspekt dabei ist der Zugriff auf die Metadaten eines SSAS Cubes mittels Analysis Management Objects. Bin zurzeit am entwickeln einer Komponente für die Integration Services für den direkten Zugriff auf einen Würfel und seine Informationen. Erste Tests mit der Skriptkomponente laufen bereits sehr gut. :-)

image

Donnerstag, 14. Oktober 2010

Microsoft hat auch eine Software für 3D Modelle!

Hätte ich ja fast vergessen! Mal was ganz anderes…

Ich war vorgestern Abend auf dem MS TechTalk zum Windows Phone 7. Da kam unteranderem das Thema Entwicklung von Spielen für das WP7 auf und die Frage woher der Entwickler denn 3D Modelle bekommen könnte bzw. womit er diese erstellen sollte. Es wurden alle Top Tools am Markt genannt. Da fiel mir ein, dass ja Microsoft vor ein paar Jahren ein ähnliches Tool gekauft hatte (bzw. die Company drum rum), ich kam zwar nicht auf den Namen, aber eine Stimme hinter mir erinnerte sich dann: TrueSpace! Dank an den Unbekannten! Yepp, TrueSpace (Caligari) gehört zu MS und TrueSpace gibst schon seit einiger Zeit for-free!

TrueSpace kann meinem Kenntnisstand nach auch Modelle für DirectX (und XNA) erstellen. Habe gerade keine Zeit dieses zu testen, aber hier der Link zum Download.

image

Mittwoch, 13. Oktober 2010

Excel Cube Funktionen (dynamische CUBEMENGE)

Auf meinen Cast für das Beispiel für die Excel Cube Funktion CUBEMENGE bekam ich nun das Feedback, dass das zum Teil zu schnell ging. Zwar kann ja die Pause Taste gedrückt werden, aber nicht jeder kam mit, wie ich die Zellen denn nun im Excel miteinander verknüpfe. Daher hier nun eine Übersicht darüber:

CUBEMENGE Beispiel

Also, im oberen Ausschnitt aus Excel habe ich eine Liste (keine Excel Liste!) erstellt, welche eine Nummerierung, einen endbenutzerfreundlichen Namen und die jeweilige Beschreibung einer Menge (Set) in MDX enthält. Das läuft zusammen in einer Excel Formel mit der Funktion VERWEIS. Diese holt sich als “Parameter” eine Zahl (oben die “1”). Die Zelle wird aber gefüllt über das Listboxelement, welches ich im eigentlichen Report/Dashboard im unteren Ausschnitt verwende. Diese Listbox holt sich ihre Elemente für die Darstellung wiederum aus der selben Liste.

Die eigentliche Magie steckt aber in der Formel in C3 (untere rote Ellipse) mit der CUBEMENGE Funktion. Wir geben dort als Bezeichner einfach “menge” aus, aber mittels der CUBERANGELEMENT Funktion greifen wir dann in der Spalte D auf die (unsichtbaren) Elemente innerhalb der Menge in C3 zu! Die Elemente in der Spalte D wiederum dienen den CUBEWERT Funktionen in den Spalten E & F als Parameter.

Durch die Auswahl eines Eintrags in der Listbox wird die Ordnungszahl des Eintrags in eine Zelle geschrieben (obere rote Ellipse) und dient der VERWEIS Funktion als Parameter. Das Ergebnis (ein MDX Ausdruck) ist dann der Parameter für die CUBEMENGE Funktion (untere Ellipse).

Hoffe, das hier hat das Konzept noch ein wenig verdeutlicht. Bei Fragen, mich sonst bitte einfach ansprechen!

Dienstag, 12. Oktober 2010

Weiterer Webcast über die Cube Funktionen in Excel (dynamische CUBEMENGE)

Damit habe ich nicht gerechnet! Vielen Dank für das Feedback und die vielen Fragen zu meinem kleinen Cast über die Cube Funktionen in Excel.

Eine Frage kam dabei gleich häufiger: Ist die Funktion CUBEMENGE nun nur statisch? Wo ist dann der wirkliche Vorteil für mich als Controller?

Ok, das kann beantwortet werden.

Nein, es ist sehr wohl möglich CUBEMENGE dynamisch zu nutzen. Es kann sogar die Dimension, Hierarchie und der Level dynamisch ausgetauscht werden. Wie? Das zeige ich in diesem zweiten kleinen Cast! Hoffe, dass dieser wieder ein wenig Licht ins Dunkel bringen kann und noch mehr von den Möglichkeiten der Cube Funktionen in Excel zeigt. Bin mir sehr sicher, dass ich dazu in Zukunft noch ein wenig was zeigen werde.

Sonntag, 10. Oktober 2010

Analysis Management Objects (aka AMO) Overview

Hier ein Slide aus meinem Deck über Analysis Management Objects. Bin gerade am “Aufräumen”, da ich nächste Woche im PASS Chapter Hamburg einen kleinen Vortrag darüber halten werde und in der Woche drauf dann während des PASS Camps das Thema im Detail mit den Teilnehmern durchgehen werde.

AMO Objects Overview

Ich poste das Slide, da ich in meiner Rolle als Coach & Berater immer wieder auf die Meinung treffe, dass die SQL Server Analysis Services sich primär um den OLAP Cube als Objekt drehen. Das ist aber nur bedingt richtig. Zwar ist “der Cube” meist das Ziel in der Arbeit mit den Analysis Services, aber im Vordergrund steht die Arbeit mit der SSAS Datenbank. Ein OLAP Cube ist nur ein Teil dieser Datenbank! Aus diesem Missverständnis heraus entstehen meist irrtümliche Annahmen über den Aufbau von Cubes und der darunterliegenden Strukturen. Als Coach empfehle ich jedem, der mit SSAS zu tun hat, dass er sich bei Zeiten mal näher mit den Analysis Management Objects auseinandersetzt, da “das Codieren” eines Cubes (und damit einer SSAS Datenbank) durchaus neue Erkenntnisse und Einsichten über den Aufbau der Analysis Services bringen kann.

Einladung zum 54. PASS Treffen in Hamburg

Diese Woche ist es wieder soweit! Das monatliche PASS Treffen in Hamburg steht an.

Wir werden uns im Detail die Analysis Management Objects (aka AMO) zum Zugriff auf die SQL Server Analysis Services anschauen und anhand von Codebeispielen lernen, wie diese für den Aufbau von OLAP Cubes auf Basis eines Repositories genutzt werden können. AMO ist bitte nicht zu verwechseln mit ADOMD.NET, welches eher für den Zugriff auf die Daten eines OLAP Cubes genutzt wird.

Details zum Treffen findet Ihr unter http://bit.ly/ciRv5e!

Donnerstag, 7. Oktober 2010

Webcast über Cube Funktionen in Excel

Im Mai diesen Jahres hatte ich einen Blogbeitrag geschrieben über die Cube Funktionen in Excel 2007 & 2010. Die letzten Monate habe ich eine ganze Menge Feedback dazu bekommen. Die Funktionen scheinen bisher nicht so bekannt gewesen zu sein und viele haben sich an meiner Schritt-für-Schritt Anleitung versucht. Von einigen Teilnehmern der Community kam der Wunsch nach einen Video zu dem Thema. Diesem bin ich nun endlich nachgekommen. Hoffe, dass der Einstieg in die Arbeit mit den Cube Funktionen nun noch ein wenig einfacher wird. Viel Erfolg!

Dienstag, 5. Oktober 2010

Erfahrungsbericht SQLBits 7 Konferenz in York, UK

image

So, und schon wieder von was zurück… :-)

Dieses Mal von der größten SQL Server Konferenz in Europa. Der SQLBits Konferenz. Diese fand nun schon zum siebten mal statt. Als Veranstaltungsort wurde die University of York gewählt. Genauer gesagt das Exhibition Center des Heslington Campus in York. Ein modernes Universitätsgelände mit dem entsprechenden geselligen und gelehrigen Charme.

Für mich war es die erste SQLBits. Und nicht genug, ich war auch gleich Sprecher.

Die Konferenz bestand aus drei Tagen:

    • - einem Workshop Tag, also klassische kostenpflichte Pre-Con (Donnerstag)
    • - einem Tag, für den bezahlt werden musste, da “hochwertiger” Content (Freitag)
    • - und einem Community Tag, welcher von Sponsoren finanziert wurde (Samstag)

Die Organisatoren hatten meine Session für den Freitag ausgewählt. Die Session hatte den Titel “The Developer Side of the Microsoft Business Intelligence stack”, welche eine 60 min. Zusammenstellung der vielseitigen Möglichkeiten der Nutzung des Microsoft SQL Servers in Enterprise Business Intelligence und Data Warehouse Umgebungen bot. Durch meine Erfahrung (als Teil von PSG) in Projekten, konnte ich das fast ausschließlich englische Publikum, von denen wiederum wohl fast jeder in irgendeiner Bank in the City of London arbeitete, hoffentlich über die eine oder andere Audit und Compliance Hürde helfen. Als Raum war mir das Lecture Theatre zugewiesen worden, eine Mischung aus Hörsaal und Multiplex-Kino.

Meine Session verlief gut. War ja auch genau mein Thema, hätte noch locker 2-3 Stunden weitergehen können. Hatte im Anschluss noch einige sehr gute Gespräche zu dem Thema. Der Vortrag wird in den nächsten Tagen auf den SQLBits Seiten veröffentlicht werden.

So, nun aber zu der Frage: Wie war denn nun so die SQLBits insgesamt? Lohnt es sich dafür extra nach England zu kommen? Ach ja, wie viele Teilnehmer aus Deutschland denn waren da?

Also, mir hat die Konferenz sehr gut gefallen! Und es lohnt sich definitiv dafür nach England zu kommen! Daher meine SQL Konferenz Empfehlungen fürs nächste Jahr: Besucht die European PASS und nimmt eine SQLBits mit! Eine? Ja, davon gibst immer zwei im Jahr! Der Flug nach England ist günstig und Ihr könnt alles gut mit der Bahn erreichen. Ach ja, also ich glaube, es waren mit mir vier Deutsche (liebe Grüße an Sabrina und Tillmann, welche mir vom Vierten erzählten) dort und Klaus Aschenbrenner aus Österreich.

Vielen Dank an die Organisatoren und Teilnehmer der SQLBits für dieses großartige Event!

Many thanks to the organizers and participants of the SQLBits for this great event!

Wenn Euch das Thema meiner Session interessiert und Ihr mehr darüber erfahren wollt oder gar mit mir diskutieren wollt über Euren eigenen Anforderungen und wie wir diese gemeinsam lösen könnten mit dem MS SQL Server Business Intelligence Stack… dann… kommt zum PASS Camp in der übernächsten Woche in Mettmann bei Neuss! Wir werden dort alles was ich in York gezeigt habe anfassen, ausprobieren, weiterentwickeln, zerlegen und neumachen… ach ja, und wir werden viel diskutieren, Ideen entwickeln und ich werde versuchen, Euch meine Konzepte und Denkweise bei der Entwicklung solcher Lösungen nahezubringen.

Twitter-> #passcamp :-)

Montag, 27. September 2010

Back from Vacation

GEDC0392

Bin nun seit ein paar “Tagen” aus meinem letzten Urlaub zurück. Und schon wieder unermüdlich mit meinen Kollegen aus den unterschiedlichen Teams unterwegs gewesen. Es lagen sowohl spannende Workshops als auch herausfordernde Projekte rund um den SQL Server an. Vielen Dank an meine Kollegen für die zahlreiche Unterstützung vor Ort!

Eine Überraschung habe ich direkt vor meiner Haustür vorgefunden! Und zwar scheint nun auch in meinem Dorf das Highspeed-Internet Zeitalter zu beginnen. Anbei seht Ihr ein Foto von meinem ganz privaten Glasfaserkabel direkt ins Haus. Angeblich sollen darüber “demnächst” bis zu 50 MBit möglich sein. Ich bin gespannt und werde berichten. Habe auch schon die eine oder andere Idee, wie die SQL Community davon profitieren könnte.

Kommen wir zu einem sehr wichtigen Punkt: Der Mitgliederversammlung des PASS Deutschland e.V. am 18. Oktober 2010 !

Im Rahmen des PASS Camp findet dieses Jahr wieder eine MV statt. Ein wichtiger Punkt dabei ist die Wahl des Vorstandes. Ich bitte Euch zahlreich zu erscheinen, denn IHR SEID DIE COMMUNITY! Es gibt als Vortrag “drum rum” das spannende Thema „Parallel Data Warehouse“ von Ralph Kemperdick (Microsoft Deutschland).

Und wo wir gerade beim PASS Camp sind! Dieses findet vom 19. bis 21. Oktober 2010 bei Mettmann (Gut Höhne) statt. Wir haben dort 4 spannende 3-Tages Workshops dabei. Es gibt BI-Front End, SQL Azure und das SQLCAT Team mit BI for Administrators. Natürlich möchte ich nicht meinen Workshop “BI für Entwickler” unerwähnt lassen, welcher dem BI Berater den Nutzen von Programmierung in Business Intelligence Projekten nahebringen wird! Wir werden gemeinsam über den Einsatz von Meta Daten diskutieren und in Form von Hand-on Labs unsere eigenen Tools für die Nutzung eines BI Repositories in SQL Server Umgebungen schreiben. Wir werden dynSSIS erforschen und mittels AMO Cubes aus Meta Daten generieren. Reports (RDL) untersuchen und inventarisieren. Und vieles mehr! Ich freue mich schon auf den Austausch mit Euch!

Aber vorher gehst für mich nach York, UK zur “SQLBits - The 7 Wonders of SQL” Konferenz. Dort halte ich diesen Freitag die Session “The Developer Side of the Microsoft Business Intelligence stack”. Ihr seht, bin zurzeit voll im Thema Backend unterwegs! :-)

Und ich möchte noch Werbung machen für folgendes Microsoft TechNet Seminar in Hamburg am 10.11.2010: Managed Self-Service Business Intelligence mit SQL Server 2008 R2, Sharepoint 2010 und Office 2010! Im Anschluss an das Treffen findet in der Microsoft Niederlassung auch noch unser monatliches PASS Treffen statt! Wenn Ihr Zeit und Lust habt, dann könnt Ihr also einen ganzen Tag mit SQL Server Themen und der Community verbringen. Hoffe möglichst viele von Euch dort zu treffen!

Donnerstag, 12. August 2010

Business Intelligence Framework Vortrag auf der SQLBits 7 in York, UK

Diese Woche habe ich erfahren, dass ich auf der Konferenz SQLBits 7 (The 7 Wonders of SQL) eine Session halten darf!

Die SQLBits ist wohl mit die größte SQL Server Konferenz, welche man auf dieser Seite des Atlantiks finden kann und findet in UK statt. Dieses mal geht es nach York an die York University. Die Konferenz findet vom 30.9. – 2.10. statt. Weitere Details hier –> www.sqlbits.com . Vielleicht treffe ich ja den einen oder anderen von Euch dort!!?

Meine Session dreht sich um Business Intelligence und den sinnvollen Einsatz von Developer Tools für die Bereitstellung einer BI Middleware bzw. eines BI Frameworks, welches die Dienste des SQL Server ein wenig fester verbindet.

The Developer Side of the Microsoft Business Intelligence stack

The Microsoft SQL Server provides a complete library of programmatically accessed objects for all Business Intelligence relevant services. With this set of functions almost any customer challenge can be solved without the need to purchase additional products. This possibility is often underestimated in projects.
We will explore the ways how to create powerful solutions with Integration Services, Reporting Services and, of course, Analysis Services. This session provides many samples and .net sourcecode to demonstrate the possibilities of creating your own tools with Windows Forms and Silverlight for your daily work. Many manual clicks and tasks can be automated, really!
Finally we build a complete Business Intelligence Middleware as a blueprint for your own projects.

 

SQLBits Logo

 

Die Themen, welche ich dort in 60 Min anreißen werde, gibt aber auch noch mal im Detail und zwar ganze drei Tage lang mit Hands-on von mir auf dem PASS Camp 2010 R2 in Mettmann bei Düsseldorf!

Freitag, 6. August 2010

Die Website für die Anmeldung zum PASS Camp 2010 (R2) ist online!

Hier nur “kurz” die Meldung, dass die Website für die Anmeldung zum PASS Camp 2010 (R2) online gegangen ist!

Ihr erinnert Euch vielleicht, da bin ich dieses Mal als Sprecher dabei und werde Euch mein absolutes Lieblingsthema drei Tage am Stück nahebringen: Microsoft Business Intelligence für Entwickler!

Hier gehst zum PASS Camp 2010!

Das ist die Agenda für meinen Track:

Dienstag, 19.10.2010

  • Einleitung - Warum überhaupt programmieren?
    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.
  • Einführung mittels Crashkurs in die Entwicklung mit dem Visual Studio 2010
    Damit alle mit den gleichen Voraussetzungen starten können, gibt es nach dem ersten Brocken Theorie, einen Crashkurs für die Nutzung des Visual Studios 2010.
    Anhand von Labs wird die grundlegende Handhabung des Visual Studios vermittelt und in die Programmierung mit dem .net Framework eingeführt.
    Dabei werden folgende Themen erläutert:
    - Command Line Tools
    - PowerShell (CmdLets)
    - Entwicklung von einfachen GUIs
    - XML-Files als Parameter verwenden
    - Nutzung von ADO.NET für den Zugriff auf den SQL

Mittwoch, 20.10.2010

  • SQL Server Analysis Services
    Nun kommen die Analysis Services an die Reihe. Zunächst beschäftigen wir uns kurz mit ein wenig MDX Grundlagen, um dann mittels ADOMD.NET OLAP Cubes direkt abzufragen. Damit haben wir die Grundlage für eigene OLAP Clients geschaffen.
    Als nächstes beschäftigen wir uns mit den Analysis Services Management Objects (kurz AMO), um die Erstellung von OLAP Cubes entweder teilweise oder gar vollständig auf der Basis von Metadaten zu automatisieren. Wir erstellen Dimensionen und Measures. Des Weiteren schaffen wir die Grundlagen für einen eigenen KPI Designer für Cubes. Diese Technologie lässt sich ganz hervorragend kombinieren mit unseren neuen Kenntnissen vom Vortag über dynamisches SSIS.
  • SQL Server Reporting Services
    Mit den Reporting Services geht es weiter. Wir entwickeln zuerst eigene Berichtselemente. Des Weiteren beschäftigen wir uns mit der Flexibilität der Reporting Services bei der Umsetzung von Anforderungen für die Integration von Berichten in vorhandene Umgebungen.
    Zwischendurch schauen wir uns noch den Ansatz an die Reporting Services als Benutzeroberfläche zu verstehen und BI entsprechend zu konzeptionieren.
    Auch bei den Reporting Services wenden wir uns zum Abschluss den Möglichkeiten zur automatischen Erstellung und Wartung zu. Wir erstellen gemeinsam Werkzeuge mit denen RDL Dateien (aka Reports) auf Basis von Metadaten erstellt als auch inventarisiert werden können.
  • Weboberflächen mit ASP.NET / Ajax
    Zeit sich intensiver mit der Entwicklung von Benutzeroberflächen und Visualisierungen zu beschäftigen. Es gibt Grundlagen für die Erstellung von Weboberflächen mit ASP.NET / Ajax und der Kommunikation mit den SQL Server Diensten via Web Services und WCF. Dann aber experimentieren wir gemeinsam mit GDI+, um erste alternative Visualisierungen umzusetzen.
    Da wir ja nicht alles selbst schreiben wollen, schauen wir uns auch noch das Chart Control des .net Frameworks ein wenig genauer an.

Donnerstag, 21.10.2010

  • Silverlight
    Heute kommt noch mehr Interaktivität ins Spiel. Mittels Expression Blend entwerfen wir erste Entwürfe für moderne Benutzeroberflächen (RIA) und beschäftigen uns dabei mit der Beschreibungssprache XAML.
    Dann drehen wir das Ganze um und steigen in die Steuerung einer Silverlight Anwendung vom Code aus ein. Nun nehmen wir unsere Erkenntnisse über SSIS, SSRS, ADOMD.NET und AMO und binden diese in unsere Silverlight Anwendungen ein. Damit haben wir auf der einen Seite sehr dynamische Oberflächen und auf der anderen Seite einen Zugriff auf die Dienste des SQL Servers für den Zugriff auf Daten (ADOMD.NET) und die Steuerung der Prozesse zur Verarbeitung (SSIS & AMO) dieser.
    Abschließend entwickeln wir gemeinsam die Grundlagen für einen universellen OLAP Client unter Silverlight, welcher sich flexibel an Anforderungen in Projekten anpassen lässt.
  • Erweiterungen für Office & SharePoint 2007/2010
    Nach soviel Neuem wenden uns nun wieder unserem alten Freund Excel zu und erweitern diesen um selbsterstellte Aufgabebereiche für den Zugriff auf Daten und unsere erstellten Dienste.
    Zum Abschluss des Workshops werfen wir noch einen Blick auf den SharePoint Server. Wir entwickeln eigene Webparts, welche wiederum auf unsere Daten und Dienste zugreifen werden. Und wo wir gerade dabei sind, werden wir die SharePoint Search Funktionalität für unsere BI Lösungen zu nutzen lernen.

Mittwoch, 4. August 2010

Microsoft Visual Studio LightSwitch (managed Access?)

Bin ja sonst nicht mehr so der Fan von Product-Placement, aber das hier scheint ein paar Zeilen wert zu sein!

Hier kommt ein neues Visual Studio (Codename Kittyhawk), welches u. a. für den ambitionierten und kreativen Endanwender gedacht sein wird. LightSwitch ist damit das langerwartete “managed Access”!?!

Es macht einen durchdachten Eindruck, wie da in den Demos SQL Server, SQL Azure, SharePoint usw. mittels einer wirklich einfachen Oberflächen zusammengebracht werden. Ohne es bisher selbst in den Händen gehabt zu haben, kann ich mir trotzdem vorstellen, dass es einen deutlichen Drive in die Entwicklung von diesen kleinen fiesen aber geschäftskritischen Anwendungen bringen wird, welche in diesem Paralleluniversum neben dem ERP System existieren!

http://www.microsoft.com/visualstudio/en-us/lightswitch

Die Beta soll ab dem 23. August verfügbar sein.

Schön ist auch der Claim: “THE SIMPLEST WAY TO BUILD BUSINESS APPLICATIONS FOR THE DESKTOP AND CLOUD”

We are all in! :-)

Dienstag, 3. August 2010

Nutzung eines Jobpools in Business Intelligence Umgebungen

Da ich vor ein paar Tagen ja über Repositories in Data Warehouse Umgebungen geschrieben habe, hier noch ein paar weitere Gedanken dazu. Im Rahmen der European PASS Conference 2009 habe ich zwei Vorträge gehalten. In dem einen ging es primär um dynamisch erstellte SSIS Pakete. Eine äußerst leistungsfähige Technologie, wenn in umfangreicheren Projekten eine größere Menge an SSIS Tasks und Paketen benötigt wird, welche auf Basis von Metadaten erzeugt werden sollen. Ein sekundärer Aspekt dieser Session, welcher ein wenig unterging, war die Nutzung eines Jobpools innerhalb eines Repositorys.

Damit sind wir wieder beim Thema. Es geht mir dabei um die Arbeit mit einer großen Menge an einzelnen Paketen und Jobs, welche zum Beispiel im Rahmen einer Datenbewirtschaftung eines Data Warehouses verarbeitet werden müssen. Natürlich gibt es eine ganze Reihe von Abhängigkeiten, welche bei der Abarbeitung berücksichtigt werden müssen! Als Lösung für eine solche Herausforderung wird gerne die Ablaufsteuerung von SSIS verwendet. Mit dieser lassen sich Abhängigkeiten zwischen einzelnen Paketen sehr leicht visuell modellieren. Dabei werden Jobs in immer der identischen sequentiellen Reihenfolge bzw. parallel abgearbeitet.

Blog Repository Folien1

Ein Nachteil dieser Vorgehensweise ist aber die Handhabung in sehr großen Umgebungen, welche auch noch zum Teil dynamisch sind. Wenn dann noch der Wunsch nach automatischer Lastverteilung, Skalierbarkeit und Ausfallsicherheit an die Umgebung gestellt wird, dann kann es schon äußerst komplex werden!

Als eine mögliche Lösung für dieses Szenario setze ich gerne auf einen sogenannten Jobpool. Dabei werden die einzelnen Aufgaben bzw. Jobs zentral in einem Pool abgelegt. Von “außen” greifen nun sogenannte Agents auf diesen Pool zu und “suchen” sich die Pakete, welche sie verarbeitet werden dürfen.

Blog Repository Folien2

Ob ein Paket aus dem Pool genommen werden darf und verarbeitet werden kann, wird auf Basis von Regeln entschieden. Zum Beispiel kann eine sehr einfache Regel sein, dass erst alle Pakete der Gruppe “ExtraktionCRM” fertig sein müssen, bevor mit der Verarbeitung der “Dimension Kunde” begonnen werden kann. Dabei ist es aber nicht entscheidend, in welchen Reihenfolge die Pakete der Gruppen “ExtraktionCRM” ausgeführt werden.

Wenn nun ein neuer Job dem Pool hinzugefügt wird, dann muss dieser nicht mit anderen Jobs “verdrahtet” werden, sondern er wird einem Regelsatz zugewiesen. Die Agents, welche die Pakete bzw. Jobs verarbeiten, können für unterschiedliche Aufgaben zur Verfügung stehen. Zum Beispiel dem einfachen Ausführen von SSIS Paketen oder dem Verarbeiten von AMO Anweisungen für den Aufbau von Cubes. Die Agents können über mehrere Server verteilt werden. Dadurch ist eine Lastverteilung und Skalierbarkeit gegeben, ohne, dass eine Ablaufsteuerung manuell an die neue Hardware (welche auch gern virtuell sein kann) angepasst werden muss. Der Ausfall eines Server ist zwar bedauerlich, da seine Leistung fehlt, aber führt nicht mehr zum Abbruch der gesamten Verarbeitung!

 Blog Repository Folien

Wichtig ist mir die Abgrenzung, dass ein Jobpool erst in größeren Umgebungen Sinn macht! In einer überschaubaren Umgebung ist die SSIS Ablaufsteuerung mit ihren Möglichkeiten wesentlich sinnvoller. Der Moment über einen Jobpool nachzudenken ist gekommen, wenn der Verantwortliche für die Datenbewirtschaftung erst ein paar Minuten braucht, um die vermeintlich richtige Stelle in einem Paket zu finden, um einen neuen Job hinzuzufügen. Auch Anforderungen wie Skalierbarkeit, Lastverteilung und Ausfallsicherheit können Treiber für diesen Ansatz sein.

Sonntag, 1. August 2010

Die verwendeten Spalten und Tabellen einer beliebig komplexen SQL Query ermitteln

Mein letzter Blogeintrag zum Thema Repository im Data Warehouse scheint einige Fragen aufgeworfen zu haben!

Neben dem eigentlichen Thema “Repository”, danke für die Rückmeldungen, kam oft die Frage, wie ich denn nun aus einer SQL Query die in dieser verwendeten Spalten der Quelltabellen auslese und was der Queryplan damit zu tun hat. Daher hier jetzt ein paar mehr Informationen dazu.

Die Vorgehensweise ist ein Abfallprodukt aus der Entwicklung eines Performancetuning Tools in einem Projekt.

Kurz zur Sicherheit erwähnt, wofür ich sowas in Projekten überhaupt benötige. Es geht um die Aufgabenstellung, dass ich hunderte von Queries habe und sehr gerne “auf-Knopfdruck” sehen möchte, welchen Einfluss eine Änderung am Datenmodell auf eben diese Queries hätte. Woher habe ich diesen Berg Abfragen? Entweder aus einem Profiler Trace einer OLTP Anwendung oder aus RDL-Dateien. Auch schon gemacht, daher hier als möglich aufgezählt, die Quellen in SSIS Paketen und Analysis Services Projekten. Auf jeden Fall sind die von einer Lösung verwendeten Queries immer gute Kandidaten in einem entsprechenden Repository gespeichert zu werden.

Gerne empfehle ich ISVs auch ein solches Repository als Grundlage einer Dokumentation zu führen und vor Änderungen am Datenmodell wie hier beschrieben vorzugehen. Damit fängt ein gutes Qualitätsmanagement doch erst an. Das Performancetuning kann dann gleich “daneben” gepflegt werden. So sah übrigens das ursprüngliche Projekt aus.

Die Aufgabenstellung nach den verwendeten Spalten hatte ich schon oft, aber häufig ist der erste Gedanke der Kunden, dass man dafür doch einen separaten SQL Parser bräuchte. Nun ja, sicherlich machbar, also mit entsprechend Zeit usw., aber nutzen wir doch den SQL Server als Tool dafür!

Nehmen wir mal eine einfache Query für das AdventureWorksDW2008

select SUM(salesamount) as summe
from dbo.FactInternetSales f
left join dbo.DimCustomer c on f.CustomerKey = c.CustomerKey
where c.HouseOwnerFlag = '0'

Mittels SET SHOWPLAN_XML ON bringe ich den SQL Server dazu, dass dieser…

a.) die Query nicht ausführt
b.) mir den geschätzten Ausführungsplan im XML Format liefert

image

Schon mal total toll. Nur bringt es mich überhaupt nicht weiter, da ich den Prozess ja automatisieren möchte. Also Management Studio zu, Visual Studio auf und ein wenig C#.

SqlConnection con = new SqlConnection(<ConnectionString>);
con.Open();
SqlCommand showplan_on = new SqlCommand("set showplan_xml on", con);
showplan_on.ExecuteNonQuery();

SqlCommand query = new SqlCommand(<Query>, con);
SqlDataReader showplan_results = query.ExecuteReader();
if (showplan_results.Read())
    tbOutput.Text = showplan_results[0].ToString();
showplan_results.Close();

SqlCommand showplan_off = new SqlCommand("set showplan_xml off", con);
showplan_off.ExecuteNonQuery();
con.Close();

image

Und schon habe ich den geschätzten Ausführungsplan erhalten und zwar ohne, dass meine Query ausgeführt wurde!

Mit so einem Ausführungsplan kann man nun sehr spannende Sachen machen, aber für unseren Fall hier interessieren uns nur die Elemente mit dem Namen ColumnReference. Da stecken nämlich unsere Spalten drin. Wie kommen wir da nun ran? Der Ausführungsplan ist bereits geladen. Aber er ist noch als String verpackt. Das kann das .net Framework aber besser, daher nix wie ab in eine XML Datenstruktur und die Elemente gesucht.

XmlDocument dom = new XmlDocument();
dom.LoadXml(tbOutput.Text);

XmlElement root = dom.DocumentElement;

XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable);
nsmgr.AddNamespace("bk", "
http://schemas.microsoft.com/sqlserver/2004/07/showplan");

XmlNodeList nodelist = root.SelectNodes("//bk:ColumnReference[@Database]", nsmgr);

Und wir haben eine NodeList mit unseren Elementen! Diese können wir nun ausgeben.

xn.Attributes.GetNamedItem("Database").InnerText + "." + xn.Attributes.GetNamedItem("Schema").InnerText + "." + xn.Attributes.GetNamedItem("Table").InnerText + ".[" + xn.Attributes.GetNamedItem("Column").InnerText + "]"

Da haben wir unsere Spalten! War doch ganz einfach, oder?

image 

Und das funktioniert dann natürlich nicht nur mit SELECT Statements! Hier mal ein Beispiel für ein UPDATE Statement mit Unterabfragen.

image 

Ergibt folgende Ausgabe:

image 

Mit dieser Vorlage sollte sich eigentlich jeder sein eigenes Tool für diese Art von Fragestellung bauen können. Viel Spaß damit!

Donnerstag, 29. Juli 2010

Überlegungen über den Aufbau eines Repositorys in einer Business Intelligence Umgebung

Ein kürzlich geführtes Gespräch mit einem Community Kollegen über das Thema Repositorys in Microsoft Business Intelligence Umgebungen, brachte mich auf die Idee meine Überlegungen und Erfahrungen zu dem Thema hier mal kurz zu skizzieren.

Meine Definition eines Repositorys ist eine zentrale Sammlung von Metadaten, Versionsständen und Protokollen. Ein solches Repository gehört meiner Meinung nach primär zu dem Themenkomplex Data Warehouse.

Das Versprechen einer Business Intelligence Lösung bzw. eines Data Warehouses ist u. a. die Bereitstellung der sogenannten “einzigen Wahrheit” in der Organisation. Das ist zum Beispiel durch den Einsatz von OLAP Cubes technisches relativ leicht durchzusetzen. Alle weiteren Frontend Werkzeuge (zum Beispiel Reporting Services oder Excel) greifen auf diese Datenquellen zu. Was passiert aber nun, wenn sich Strukturen des Data Warehouses und/oder der OLAP Cubes verändern? Diese Veränderungen ziehen sich in der Regel bis zu den Frontends durch und haben sehr wahrscheinlich auch Einfluss auf die schon bereitgestellten Reports in Reporting Services und Excel.

In einer klassischen Microsoft Business Intelligence Umgebung greifen die Dienste direkt auf die jeweils anderen Dienste zu.

Präsentation1

Die Dienste des SQL Servers sind technisch gesehen eigenständig. In einer BI Lösung werden diese zwar miteinander verbunden, aber diese Kopplung ist recht lose. Auf der einen Seite sind damit äußerst flexible Architekturen möglich, auf der anderen Seite gibt es kein zentrales Element, welches die Kommunikation zwischen den Diensten steuert. Szenarien, wie das oben geschilderte, werden durch keine Architekturschicht “aufgefangen”.

Die Verwendung eines zentralen Repositorys, welches zwischen den Dienste steht, unterstützt die Business Intelligence Umgebung dabei das Versprechen einer einzigen Wahrheit nachhaltig einzulösen.

Präsentation1

Die Technologie hinter einem solchem Repository ist in unseren Projekten die relationale Engine des SQL Servers. Die notwendige Flexibilität gibt mir aber die Kombination aus strukturierten und semi-strukturierten Daten. Ein Ziel ist es, dass im Projekt als auch bei der späteren Verwendung der Business Intelligence Umgebung nicht mehr an unterschiedlichen Orten nach Informationen gesucht werden muss, sondern, dass gezielt das Repository genutzt werden kann.

Bereits während der Einführung einer Business Intelligence Lösung sollte daher auf den konsequenten Aufbau eines durchgängigen Repositorys geachtet werden.

Das ist zwar jetzt sehr theoretisch, aber gehen wir mal bei einem Beispiel ein wenig ins Detail. Die Reporting Services sind ein sehr leistungsfähiger Dienst. Die Definition der Reports liegen in sogenannten RDL-Dateien vor. Als Beschreibungssprache wird die Report Definition Language verwendet. Diese ist auch sauber von Microsoft dokumentiert.

Innerhalb einer RDL-Datei wird auf eine Datenquelle verwiesen, welche gesondert beschrieben wird. Aber die eigentliche Definition der verwendeten Felder innerhalb des Reports ergibt sich im Report direkt aus dem CommandText der Query und den definierten Feldern. Es ist mit Hausmitteln später nicht mehr einfach herauszufinden, woher die Felder im Report kommen. Dazu müsste die Query analysiert werden (komme ich noch zu). Auch das neue Feature der Shared datasets bringt hierfür nicht wirklich etwas (sonst äußerst praktisch!), da es nur eine weitere Abstraktionsebene zwischen Report und Datenquelle zieht, aber keine eindeutiges Mapping der Felder zu Tabellen (oder Cubes) zulässt. Hier mal ein Blick direkt in eine RDL-Datei. Wir sehen die Query und die einzelnen Felder, aber kein Mapping!

image

Eine konkrete Überlegung für das Repository ist, dass dieses Mapping aber für Impact-Analysen auf jeden Fall stattfinden muss. Wie kann sowas nun realisiert werden?

Im Falle einer relationalen Quelle, also zum Beispiel des direkten Zugriffs von Reports auf das Data Warehouse, lässt sich das recht einfach mittels automatischer generierter Views lösen. Das Data Warehouse stellt über das Repository, als eine Art Presentation Layer, eine Reihe von Views bereit, welche in den Reports verwendet werden können. Wichtig ist dabei, dass die Flexibilität nicht künstlich beschnitten wird. Es sollte auch nicht verschwiegen werden, dass es durchaus Möglichkeiten gibt auf Basis der Query innerhalb eines Reports an die verwendeten Tabellen und Views zu kommen. Realisierbar ist das mit einer Mischung aus RDL-Datei auslesen und Queryplan abfragen! Damit bringen uns selbst Sub-Queries und geschachtelte Views nicht um den Verstand! :-)

Bei einer multidimensionalen Quelle, also einem OLAP Cube, ist es leider nicht ganz so einfach. Da haben wir out-of-the-box keine Views, die wir dafür verwenden können. Um dieser Herausforderung Herr zu werden, macht es Sinn sich mit AMO zu beschäftigen. Den Analysis (Services) Management Objects. Mittels dieses praktischen Frameworks können Cubes auf Basis unserer Metadaten aus dem Repository automatisiert erzeugt werden. Damit haben wir zumindest eine zuverlässige und saubere Datenbasis, auf welcher wir dann aufsetzen können mit den Frontends. Die Metadaten, welche AMO nutzt, greifen zum Beispiel wiederum auf die oben erwähnten Views des Data Warehouses zu.

Wie Ihr seht gibt es durchaus Anwendungsfälle für ein Repository im Rahmen eines Business Intelligence Projektes!

Ein Repository wird bei der Erstellung eines ersten Prototypen einer Business Intelligence Lösung bzw. Umgebung aber meist als überflüssig empfunden. Vielleicht entsteht sogar der Verdacht, dass der Berater künstlich zusätzlichen Zeitaufwand generieren möchte und keinen echten Gegenwert dafür liefert. Dabei gibt es ja eine ganze Reihe von sehr guten Gründen für den Einsatz einer solchen Architektur!

Ein guter Ansatz ist es wesentlich mehr Aufmerksamkeit (und das ist nicht zu verwechseln mit Zeit!) in die Pflege der verwendeten Quellen zu legen. Wenn es geschafft wird die Quellen als eigenständige Objekte zu verstehen, welche entsprechend auch für sich gepflegt werden, dann ist das Projekt meist auf einem guten Weg. Im Rahmen eines standardisierten Deployment Prozesses sollten später neue Objekte auch direkt in das Repository aufgenommen werden.

Ich denke, dass ich mit Sicherheit auf dem PASS Camp im Oktober das eine oder andere zu diesem Thema zeigen werde. Wir werden zum Beispiel RDL-Dateien auseinandernehmen und uns eigene AMO Prozesse codieren.

Samstag, 24. Juli 2010

ADOMD.NET und die CellSet Klasse

So, als eine Ergänzung zu meinen letzten Einträgen zum Thema ADOMD.NET, habe ich heute ein paar weitere Details zur CellSet Klasse.

Ich hatte ja bereits gezeigt, wie Ihr generell mittels ADOMD.NET und der CellSet Klasse auf Daten eines Cube zugreifen könnt. Dazu hatte ich auch ein paar Eigenschaften und Methoden der CellSet Klasse erläutert. Hier nun ein Beispiel für den Zugriff auf ein Resultset innerhalb eines CellSets.

Hier nochmal ein Stück Code, welches sich mit einem Analysis Services Cube verbindet und eine MDX Query ausführt.

AdomdConnection mdcon = new AdomdConnection(“<ConnectionString>”);
mdcon.Open();
AdomdCommand cmd = mdcon.CreateCommand();
cmd.CommandText = “Query”;
CellSet cs = cmd.ExecuteCellSet();
mdcon.Close();

Entscheidend für uns ist hier das CellSet cs, welches wir nun ein wenig mehr “auseinandernehmen” werden!

Dafür brauchen wir aber auch die MDX Query:

SELECT
{[Date].[Calendar].[Calendar Year].&[2003], [Date].[Calendar].[Calendar Year].&[2004]} on Columns,
NON EMPTY CROSSJOIN({[Product].[Product Categories].[All Products].children}, {[Customer].[Customer Geography].[All Customers].children}) on Rows
FROM [Adventure Works]
WHERE ([Measures].[Internet Sales Amount])

Wir sind mal wieder auf “Adventure Works” unterwegs. Hier lassen wir uns für die Jahre 2003 und 2004 die Internet Umsätze aufgeschlüsselt nach Produktkategorien und Kundenregionen darstellen.

Das Ergebnis können wir uns so vorstellen:

image

Nur wie kommen wir jetzt mittels des CellSet Objektes cs an die einzelnen Zellen? Um das mal anschaulich darzustellen, habe ich hier für das Resultset von oben die jeweiligen “Pfade” durch das Objekt zu den Daten und Überschriften aufgeführt.

image

Das ist ja schon mal übersichtlich. Nur was sind jetzt diese ganzen Auflistungen und Objekte?

Fangen wir einfach an. Bei der Aufbereitung eines CellSets sollten wir uns zunächst fragen: Wie viele Achsen hat das Resultset? Wer sich mit MDX schon mal beschäftigt hat, weiß ja, dass durchaus mehr als nur zwei Achsen möglich sind. Sowas sollten wir abfangen!

Also mit cs.axes.count kommen wir an die Anzahl der Achsen.

Von der Achse aus kommen wir zur Auflistung Positions, welche uns zu den Tuples der jeweiligen Achse bringt. Unterhalb der Positions haben wir die Members. Hier müssen wir klären, wie viele Members wir haben. Also kommt hier zum Beispiel ein cs.Axes[1].Positions[0].Members.Count. Damit können wir die Beschriftung oben und an der Seite durchführen. Wenn wir uns den UniqueName mit merken, können wir auch bereit sein für weitere Filtervorgänge.

An die eigentliche Werte kommen wir sehr einfach. Wir nehmen das CellSet und adressieren die jeweilige Position innerhalb des Resultsets direkt. Oben im Beispiel seht Ihr das Verfahren sehr deutlich! Und schon haben wir alles Wesentliche vom Resultset ausgelesen.

Schaut doch eigentlich ganz einfach aus, oder?

Donnerstag, 22. Juli 2010

Analysis Services Metadata mittels ADOMD.NET auslesen

Ok, mein Blogartikel über ADOMD.NET war ja auch nur als Einstieg und Anregung gedacht! Aber es kamen nun die Wünsche nach Beispielen und Demos. Daher heute mal ein wenig Democode inkl. Download. Ich hoffe, dass ich in den nächsten Tagen noch mehr dazu beisteuern kann.

Also, ich habe ein kleines Beispiel in WinForms gebaut, welches die Metadaten aus einer Verbindung mit den Analysis Services ausliest und in einem TreeView darstellt. Das ist jetzt bewusst keine fertige BI Anwendung, sondern soll als Beispiel für den Zugriff auf besagte Metadaten dienen.

image

Wichtig ist, dass Ihr auf Eurem Rechner eine ADOMD.NET DLL habt. Sprich Ihr solltet ADOMD.NET installiert haben!

Der eigentliche Code ist recht “einfach” gehalten und hält sich mit wenig auf. Es geht hier ja auch um ein erstes Demo.

            int nCubes = 0;

            tvMetadata.Nodes.Clear();

            AdomdConnection mdcon = new AdomdConnection(tbConnString.Text);
            mdcon.Open();

            foreach (CubeDef cube in mdcon.Cubes)
            {
                if (cube.Name.StartsWith("$"))
                    continue;
                tvMetadata.Nodes.Add(cube.Name + " (" + cube.LastProcessed.ToString() + ")");

                tvMetadata.Nodes[nCubes].Nodes.Add("Measures");
                foreach (Measure mes in cube.Measures)
                    tvMetadata.Nodes[nCubes].Nodes[0].Nodes.Add(mes.Name);

                tvMetadata.Nodes[nCubes].Nodes.Add("Dimensionen");
                int nDims = 0;
                foreach (Dimension dim in cube.Dimensions)
                {
                    tvMetadata.Nodes[nCubes].Nodes[1].Nodes.Add(dim.Name);

                    foreach(Hierarchy hier in dim.Hierarchies)
                        tvMetadata.Nodes[nCubes].Nodes[1].Nodes[nDims].Nodes.Add(hier.Name);
                    nDims++;
                }

                tvMetadata.Nodes[nCubes].Nodes.Add("KPIs");
                foreach (Kpi kpi in cube.Kpis)
                    tvMetadata.Nodes[nCubes].Nodes[2].Nodes.Add(kpi.Name);

                nCubes++;
            }

            mdcon.Close();

        }

Mehr ist für das Darstellen der Metadaten eines Cubes erst mal nicht notwendig!

Eine mögliche Erweiterung wäre sich neben den sprechenden Bezeichnungen auch gleich noch die UniqueNames ausgeben zu lassen bzw. zu speichern. Dafür müsst Ihr statt “Name” nur “UniqueName” verwenden. Hier mal ein Beispiel wie sowas auf der Ebene der Hierarchien aussehen kann.

image

Des Weiteren ignoriere ich zurzeit komplett die DisplayFolder, diese könnten natürlich auch eingebaut werden. Also da ist noch Raum für Kreativität. Und bevor ich es vergesse, dieses Demo und viele weitere gibt es auf dem kommenden PASSCamp 2010 in meinem Track!

Das Projekt gibt es als Download genau hier: http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip

Montag, 19. Juli 2010

Microsoft SQL Server 2008 R2 Update for Developers Training Course

Es gibt auf Basis des SQL Server 2008 R2 Update for Developers Training Kit nun auch noch auf Channel9 einen passenden Kurs in Form von Webcasts!

Also, hier geht es zum Microsoft SQL Server 2008 R2 Update for Developers Training Course ! :-)

Samstag, 17. Juli 2010

PivotViewer Extension for Reporting Services CTP1

Vielleicht erinnert Ihr Euch noch an Pivot? Ich hatte schon mal kurz drüber geschrieben. Dazu ist mittlerweile einiges passiert.

Es gibt nun ein PivotViewer Silverlight Control als Download, welches Ihr auf Euren Seiten einsetzen könnt!

Aber was noch cooler wird, ist die Tatsache, dass Microsoft nun für den SharePoint 2010 ebenfalls eine Erweiterung, welche auf dem Control basiert, als CTP auf der Straße. Diese wird zwar als Designstudie bezeichnet, aber das wirkt schon durchdacht für den Moment.

image

Den Download der “PivotViewer Extension for Reporting Services CTP1” gibt es hier: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d31f609d-a353-41ad-a1a4-f81456e3a6c4

Den Blog zum Projekt und einer sehr nützlichen Anleitung für die Installation hier: http://petcu40.blogspot.com/2010/07/pivotviewer-extension-for-reporting.html

Erste Schritte mit ADOMD.NET

In den letzten Jahren habe ich eine ganze Reihe von Vorträgen über den Zugriff auf Analysis Services Cubes mittels .net Code und ADOMD.NET gehalten. Da die Funktionsweise eigentlich äußert einfach ist, habe ich aber bisher wenig bis wohl gar nichts dazu geschrieben. Das möchte ich nun nachholen, da sich hier bei mir die Nachfragen langsam häufen! :-)

Also, was ist ADOMD.NET eigentlich, was kann das und kostet das was?

ADOMD.NET ist ein sogenannter Data Provider von Microsoft für das .net Framework und bietet u. a. aus meiner .net Anwendung heraus die Möglichkeit auf SQL Server Analysis Services Cubes zuzugreifen. Wichtig ist dabei zu verstehen, dass ADOMD.NET kein fertiges BI Tool oder Control ist, welches ich nur noch einbinden muss und damit eine Art Excel-BI-Grid-GUI in meiner Anwendung habe. ADOMD.NET bietet mir im Code alle Möglichkeiten für den Zugriff auf die Daten, aber ich muss diese selbst kreativ nutzen . Wäre es dann nicht einfacher sich nicht gleich was Fertiges zu kaufen? Ok, wer schon mal eine Session von mir zum Thema gesehen hat, der kennt meine Antwort darauf. In der Regel wollen wir ja nicht den x’ten BI Client schreiben (auch wenn das wirklich Spaß machen kann!) oder unsere Anwendung um das Look & Feel von Excel erweitern, sondern unsere Anwender auf intelligente Art und Weise von den Fähigkeiten eines wahrscheinlich eh schon existierenden Cubes profitieren lassen. Mit Fähigkeiten meine u. a. ich die Flexibilität und Performance in Bezug auf sogenannte Ad-Hoc Queries und die damit verbundenen fast schon magischen Berechnungsmöglichkeiten. Das mit SQL Queries auf einer relationalen Datenbank abzubilden ist zwar meist möglich, aber dazu ist schon einiges an Experten KnowHow erforderlich und an die Performance eines Cubes ist meist gar nicht zu denken. Es lässt sich halt nicht jede Ad-Hoc Query vorher mit einem entsprechenden Index vorbereiten. Liegt nun mal in der Natur der Sache mit diesen Ad-Hoc Abfragen! Kommen wir kurz zu den Kosten. Good news, ADOMD.NET gibst von Microsoft zum SQL Server einfach dazu und ist Bestandteil des Feature Packs. Für den Zugriff wird nur eine gültige Lizenz für den Client benötigt. Also, wenn es aus lizenztechnischer Sicht möglich ist Excel als Client zu nutzen für die SSAS, dann auch ADOMD.NET. Details zu Lizenzen gibst bei Eurem freundlichen Microsoft Kontakt! Ach ja, Feature Packs! Hier kurz die Links, falls Ihr die nicht zur Hand habt:

Microsoft SQL Server 2008 R2 Feature Pack, Microsoft SQL Server 2008 Feature Pack & Microsoft SQL Server 2005 Feature Pack

Wie Ihr seht, gibst das Feature Pack für jede aktuellere Version des SQL Servers. Alles was ich Euch hier über ADOMD.NET schreibe, sollte auch mit jeder dieser Versionen möglich sein. Falls jemand andere Erfahrungen macht, dann Feedback an mich bitte.

Ok, auf was für Daten können wir nun in so einem Cube zugreifen? Ohne jetzt einen Grundlagenartikel über SSAS Cubes zu schreiben, hier mal kurz das Wichtigste kurz zusammengefasst:

Ein Cube besteht aus Dimensionen und Measures. Dabei könnt Ihr Euch die Dimensionen aus Geschäftsobjekte vorstellen und die Measures als die damit verbundenen Geschäftsprozesse bzw. die Ergebnisse der Geschäftsprozesse. Ein einfaches Beispiel ist der Verkauf von Artikel, dabei sind die Geschäftsobjekte “Artikel” und “Kunden” vorhanden und der Prozesse “Verkauf” und die damit verbundenen Umsätze. Nun kann in einem Cube entweder die Summe aller getätigten Verkäufe betrachtet werden oder diese werden auf Basis der Geschäftsobjekte gefiltert. Menschen mit einem Business Intelligence Hintergrund sprechen auch gern von dem “Schneiden” von Daten. Also zeige mir zum Beispiel nur die Verkäufe für die Artikelgruppen A, B & Z und nur für gewerbliche Kunden in Süddeutschland. Klingt doch einfach? Ist es auch, wobei irgendwann wird die Arbeit mit Cubes ein wenig tricky, aber für den Moment reicht uns das an Hintergrund. Das Schöne an Cubes ist es, dass sie solche und ähnliche Abfragen quasi in Gedankengeschwindigkeit verarbeiten und beantworten.

Eine Datenbank in Analysis Services ist in der Lage sich mittels einer ganzen Reihe von sogenannten Metadaten ausführlich selbst zu beschreiben. Wir haben u.a. folgende Metadaten im Zugriff:

  • Cubes
  • Dimensionen
  • Hierarchien
  • Level
  • Measures
  • KPIs
  • Named Sets

Macht es eigentlich Sinn, dass unsere Clients sich immer wieder alle Metadaten ziehen müssen? Auch dazu habe ich mich ja schon öfters geäußert. Aus der Erfahrung heraus ist dafür der Einsatz einer BI Middleware sinnvoll, welche u. a. ein Repository bereitstellt, welches alle Entitäten aller in der BI Umgebung verfügbaren Objekte bereitstellt. Dazu gehören neben der Datenbewirtschaftung (SSIS Pakete) und Reports (RDL Dateien) auch Informationen über unsere Cubes.

Häufig höre ich bei Vorträgen oder auch bei Coachings, dass es doch sicherlich viel zu aufwändig sei so einen Cube mit einzubinden. Da ist es doch einfacher zu versuchen mit den bisherigen Techniken voran zu kommen. Nun ja, was der Bauer nicht kennt, dass frisst er nicht.

Und bevor wir zu sehr in die Details einsteigen, hier ein erstes Codebeispiel für das Herstellen einer Verbindung mit einem Cube:

using Microsoft.AnalysisServices.AdomdClient;

AdomdConnection mdcon = new AdomdConnection(<constring>);
mdcon.open();

Wir machen was hoffentlich Sinnvolles…

mdcon.close();

Ok, das sieht doch schon mal ganz schlank aus. Kommen wir kurz zum Connectionstring.

Eine ganz einfache Variante ist die folgende: “datasource=localhost;catalog=adventure works dw 2008”. Ideal für Demo- und Testzwecke. Dummerweise reicht das nicht im echten Leben und es gibt fast schon unverschämt viele Parameter mit denen die Verbindung konfiguriert werden kann. Für den Moment soll das aber reichen. Unser Connectionstring zeigt auf den Server “localhost” und die Datenbank “Adventure Works DW 2008”. Und immer daran denken, eine Datenbank in SSAS kann mehrere Cubes umfassen!

So, ein weiterer Punkt ist der Namespace “Microsoft.AnalysisServices.AdomdClient” den wir hier verwenden. Damit wir ADOMD.NET überhaupt nutzen können, müssen wir zuerst im Visual Studio einen Verweis auf die “C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll” anlegen! Ab dann klappt das auch mit dem Namespace.

Und was können wir nun mit so einem AdomdConnection Objekt anfangen? Eine ganze Menge! Zunächst fragen wir einfach mal die Umgebung ab, damit wir wissen was uns da eigentlich so geboten wird. Also hier ein wenig mehr Code:

foreach (CubeDef cube in mdcon.Cubes)
  {
                if (cube.Name.StartsWith("$"))
                    continue;
                lbT1.Items.Add(cube.Name+ " ("+cube.LastProcessed.ToString()+")");               

                foreach (Dimension dim in cube.Dimensions)
                {
                    lbT1.Items.Add(" -> "+dim.Name);
                    
                    foreach (Hierarchy hier in dim.Hierarchies)
                    {
                        lbT1.Items.Add("   -> " + hier.Name);

                    } 
                } 
    }

Ist eigentlich recht einfach. Wir nehmen “mdcon”, also die Connection, und lassen uns in der Auflistung “Cubes” alle, nun ja, Cubes zeigen. Wir bekommen ein Cube Objekt, welches wiederum Eigenschaften hat, wie zum Beispiel “Name” & “LastProcessed”. In dem kleinen Codebeispiel schreibe ich die Werte in eine Listbox “lbT1”, daher dieses “lbT1.Items.Add” usw. Nun ja, und genauso machen wir weiter. Jeder Cube hat eine Auflistung für die verwendeten Dimensionen und die wiederum für die Hierarchien usw. Das ist doch einfach, oder?

Was können wir nun mit diesen Daten, welche die Cubes beschreiben, anfangen? Bereits eine ganze Menge! Hängt auch ein wenig von unserer Rolle im Unternehmen oder dem Projekt ab.

Wir können die Metadaten als Basis für spätere Abfragen nehmen. Gute Idee! Merken wir uns mal.

Wir können aber auch die Daten verwenden für den Aufbau einer Dokumentation. Wir lesen die Metadaten aus und schreiben sie relational weg. Vielleicht speichern wir auch die Daten gleich historisch ab, damit uns Änderungen auffallen bzw. wir diese dokumentiert haben. Darauf lassen sich super Reports bauen. Wozu? Kommt auf die Rolle von uns an. Wir können unsere eigene Arbeit dokumentieren und Veränderungen festhalten, also quasi unseren Arbeitsfortschritt. Aber genauso gut können wir die Arbeit anderer damit kontrollieren bzw. protokollieren wie sich über die Zeit hinweg ein Cube verändert. Das geht dann so in Richtung Projekt – und Qualitätsmanagement.

Kommen wir nun zu der eigentlichen Abfrage von Daten.

Einen Pferdefuss hat die Arbeit mit ADOMD.NET, denn Ihr müsst MDX für die Queries nutzen. Sofern Ihr bisher MDX aus dem Weg gegangen seit oder es einfach keinen Grund gab für Euch sich damit zu beschäftigen, nun ja, jetzt ist der Moment gekommen in dem MDX in Euer Leben tritt!

AdomdConnection mdcon = new AdomdConnection(tbConString.Text);

mdcon.Open();
AdomdCommand cmd = mdcon.CreateCommand();
cmd.CommandText = strMDXQuery;
CellSet cs = cmd.ExecuteCellSet();

Wir machen was Nützliches mit dem CellSet…

mdcon.Close();

Und schon haben wir unser Resultset als CellSet im Objekt “cs” vorliegen. Hier kommen so die wohl wichtigsten Zeilen mit denen Ihr ein CellSet zerlegen könnt. Mit den beiden folgenden Zeilen bekommt Ihr die Große des Resultsets zurück.

int x = cs.Axes[0].Positions.Count; // Anzahl Spalten

int y = cs.Axes[1].Positions.Count; // Anzahl Zeilen

So, nun wollen wir die Spalten- und Zeilenbeschriftungen auslesen. Für die Darstellung hat das CellSet die Eigenschaft “Caption” dabei und für Abfragen haben wir den UniqueName.

cs.Axes[0].Positions[xi].Members[0].Caption;

cs.Axes[0].Positions[xi].Members[0].UniqueName;

Ach ja, der eigentliche Wert ist ja auch noch da. Also nichts wie ran.

Value = cs[xi,yi].Value.ToString();

Das Ganze hier und noch viel, viel mehr schauen wir uns übrigens während des zweiten PASS Camp 2010 gemeinsam im Detail an.

Mittwoch, 14. Juli 2010

Warum sollten Tabellenhinweise (table hints) vermieden werden?

Immer wieder sehe ich bei der Analyse von Anwendungen, dass mit sogenannten Tabellenhinweisen (table hints) gearbeitet wird. Meist ist die Begründung, dass der “doofe” SQL Server einfach nicht verstanden hat, dass es doch extra einen nicht-gruppierten Index für die Abfrage gibt. Den hat der doch einfach ignoriert! Und von anderen Entwicklungsumgebungen sei man ja schließlich auch gewöhnt die Verwendung von Indizes explizit anzugeben. Wo ist also das Problem?

Nun ja, das Problem ist, dass die Erfahrung gezeigt hat, dass wenn soweit alles in Ordnung ist, der SQL Server ziemlich genau weiß, was er da so macht bei der Aufbereitung von Abfragen. Und wenn er einen Index nicht nutzen möchte, dann hat er in der Regel einen verdammt guten Grund dafür. Dummerweise wird dieser nicht angeben.

Der häufigste Grund dafür, dass der SQL Server einen Index nicht verwendet, ist die Vermeidung von unnötiger Arbeit. Der SQL Server kann nämlich auf Basis der sogenannten Statistiken ziemlich genau abschätzen wie viele Datensätze er berühren muss für die Verarbeitung einer Abfrage. Daher ist es extrem wichtig, dass die Statistiken aktuell sind! Also nicht einfach in den Optionen für eine Datenbank deaktivieren, wenn Ihr nicht noch zumindest einen entsprechenden Job dafür aufgesetzt habt! Ist wirklich wichtig!

Was meine ich nun mit unnötiger Arbeit? Dazu ein einfaches Beispiel.

Wir nehmen als Datenbank mal nicht AdventureWorks, sondern die neue Contoso BI. Da ist ein klein wenig mehr Futter drin. Die Tabelle FactOnlineSales bringt es zumindest auf 12.627.608 Datensätze. Das ist zwar noch nicht wirklich viel, aber für unser Beispiel reichst auf jeden Fall. Auf “statistics io on” bin ich schon mal kurz eingegangen. Damit sind die IO-Operationen gemeint und nicht die Statistiken in den Indizes!

set statistics io on;

select SUM(SalesAmount)
from FactOnlineSales
where DateKey between '31.12.2007' and '01.01.2009';

Als Wert für die “logische Lesevorgänge” bekomme ich 46648. Den gilt es zu nun minimieren. Die Tabelle hat zurzeit nur einen gruppierten Index. Der scheint zwar auch alles andere als optimal gewählt zu sein, aber das ein anderes Thema. Im Ausführungsplan sehen wir, dass ein “Clustered Index Scan” durchgeführt wird.

Nun fügen wir einen nicht-gruppierten Index hinzu für DateKey. Das macht doch Sinn, schließlich suchen wir ja nach DateKey.

Und nun? Wir führen die Query nochmal aus und bekommen wieder ein ähnliches Ergebnis. Im Ausführungsplan ist immer noch ein “Clustered Index Scan”. Hier ist nun der Moment, wo der eine oder andere schwach wird und dem SQL Server nun den Index aufzwingen will.

select SUM(SalesAmount)
from FactOnlineSales with (index(ix_datekey)) 
where DateKey between '31.12.2007' and '01.01.2009';

So, jetzt aber! Im Ausführungsplan sehen wir nun endlich, dass der Index verwendet wird. Und was kommt raus? 11186313 logische Lesevorgänge!!! Ist mein SQL Server kaputt? :-)

Natürlich nicht! Wir sehen jetzt nur, warum der SQL Server den Index bisher vermieden hat. Der Index war nämlich alles andere als optimal für diese Abfrage. Zwar nutzt der SQL Server nun den Index, aber der eigentliche Wert, der SalesAmount, steckt ja noch im gruppierten Index. Daher fliegt unsere Abfrage nun immer eine schöne Schleife zwischen nicht-gruppierten und gruppierten Index. Das kostet uns so richtig Leseoperationen und damit Zeit. Wir nennen sowas eine Schlüsselsuche (bookmark lookup).

image

Das Coole daran ist, dass hat der SQL Server aufgrund der Statistiken kommen sehen und daher entschieden, dass ein simpler Scan auf dem gruppierten Index am Ende günstiger wird. Daher mein Hinweis, dass der SQL Server schon ziemlich genau weiß, warum er einen Index mal nimmt und mal nicht. Ehrlich!

Und unsere Query? Haben wir denn nun keine Chance diese mit einem Index zu unterstützen? Aber sicher doch!

Wir nehmen wieder unseren nicht-gruppierten Index und fügen als eingeschlossene Spalte den SalesAmount hinzu. Und los. Jetzt bekomme wir nur noch 10512 logische Lesevorgänge. Und ganz wichtig, im Ausführungsplan sehen wir nur noch einen Index Seek auf unserem nicht-gruppierten Index.

image

Da der SQL Server nun alle notwenigen Spalten in unserem Index findet, gibt es keine Notwendigkeit mehr für den Ausflug in den gruppierten Index. Das ist bewusst eingesetzt Redundanz, wobei wir um die Pflege nicht kümmern müssen. Ach ja, und wir brauchten dafür natürlich keinen Tabellenhinweis!

Indizes mit eingeschlossenen Spalten sind zwar äußerst nützlich, aber bitte übertreibt jetzt nicht die Verwendung! Die Pflege kostet im Hintergrund immer Zeit beim Schreiben.

Und letzte Worte zu Tabellenhinweisen: Ja, es gibt ganz, ganz wenige Sonderfälle in denen die Verwendung Sinn macht. Aber glaubt mir, die sind wirklich selten!!!

Montag, 12. Juli 2010

Reifegradmodelle im Projektmanagement

Mich erreichte die Nachfrage, was ich denn mit Reifegradmodellen im Projektmanagement meinen würde. In einem Post hatte ich den Begriff kurz fallengelassen als Hinweis auf einen möglichen Projektverlauf im Rahmen eines Performance Tunings.

Oft beschreiben Reifegradmodelle themenbezogen die möglichen Entwicklungsschritte einer ganzen Organisation. Es gibt dabei Modelle für ganz unterschiedliche Herausforderungen: IT-Infrastruktur & Security, Business Intelligence, Projektmanagement usw. Dabei wird in der Regel als Orientierung festgelegt, wo die Organisation im Referenzmodell gerade steht, was die nächste Stufe ist und durch welche Merkmale diese zu erreichen wäre. Das Reifegradmodell fasst dabei durch sein “Modell” die einzelnen “Reifegrade” der notwendigen Prozesse innerhalb der Organisation zusammen.

Es geht mir nun darum, wie große, unhandliche und komplexere Projekte “eingefangen” werden können und damit das Risiko eines Scheiterns bereits während der Planung minimiert werden kann.

Im Rahmen von Projekten werden häufig eine ganze Reihe von Prozessen bzw. Funktionalitäten implementiert oder auch erweitert. Während der Planung von Projekten gilt es für diese Implementierungen bzw. Änderungen einen Entwurf zu erstellen, welcher beschreibt wann was wie umgesetzt wird. Die Praxis zeigt, dass dieser Vorgang häufig damit endet, dass der Planer vom Hundertsten ins Tausendste kommt. Dieser Umstand kommt häufig daher, dass nicht immer klar ist, wie weit eine Implementierung in dem jeweiligen Teilprojekt gehen soll bzw. muss! So entstehen oft große undhandliche Projekte, welche dann leider auch meist zum Scheitern verurteilt sind.

Schauen wir uns mal ein plakatives Beispiel an. Es soll ein komplettes Data Warehouse erstellt werden. Dieses Vorhaben als ein einziges großes Projekt abzubilden ist nicht unüblich. Das Scheitern solcher Projekte leider auch nicht.

Erfolgsversprechender ist es die für den Betrieb eines Data Warehouse notwendigen Prozesse in einem so genannten Implementierungsprojekt ans Laufen zu bringen. Das Projekt ist erfolgreich, wenn die Prozesse “leben” und funktionieren. Änderungen und Erweiterungen am DWH sind dann meist keine Projekte mehr, sondern fallen in die Kategorie Change Request. Damit befinden wir uns dann mitten im Change Management des Life-Cycle-Managements eines DWHs.

Trotz alledem wird es bei größeren Erweiterungen oder gar neuen Funktionen wieder die Notwendigkeit von Projekten geben. Was für Erweiterungen können das sein? Dafür ist das Thema Daten Qualität ein schönes Beispiel. Wie weit wollen oder müssen wir im Implementierungsprojekt beim Thema Daten Qualität im Data Warehouse gehen? Wäre es nicht sinnvoll für den Prozess DQ eine Reihe von Reifegraden zu definieren, mit denen wir die Entwicklungsstände dieses Teilprozesses dokumentieren und planen können?

Wenn wir bei dem Data Warehouse bleiben, dann gibt es zum Beispiel auch das Thema nachhaltige Protokollierung des Zugriffs auf Daten (kurz Audit). Ist in vielen Umgebungen ein sehr wichtiges Thema, nur wie weit soll bereits im Implementierungsprojekt dieser Prozess vollständig abgebildet werden? Wieder kann hier eine Reihe von Reifegraden die Planung vereinfachen, da diese die künftige Entwicklungsschritte der Funktionalität vorbereiten und klar voneinander abgrenzen.

Fassen wir nun die vorgesehenen Reifegrade der geplanten Prozesse und Funktionalitäten zusammen, so erhalten wir ein Referenzmodell für die angestrebte “komplette” Lösung, welche wir schrittweise erreichen können. Die Reifegrade sind damit auch die Grundlage für die Planung der Teilprojekte, welche wieder ganz klassisch im Projektmanagement stattfinden kann. Hier kommen sich unser Reifegradmodell und er Begriff Strategie sehr nahe.

Unterstützt kann diese Vorgehensweise dadurch werden, dass wir für unsere diversen technischen Objekte in unserer Lösung ein Repository nutzen und in diesem u. a. den jeweiligen Entwicklungsstand festhalten und auch gleich die weitere Planung daran binden. Wichtig ist mir hier die Abgrenzung zur klassischen separaten Dokumentation. Diese hat zwar ihre Daseinsberechtigung, aber hat in der Regel keine direkte Bindung mit den Objekten in der Lösung. Objekte in einem solchen Repository können zum Beispiel SSIS Pakete, DQ Regeln, Inhalte von Reports (RDL), Dimensionen und Fakten eines Cubes und / oder eines Data Warehouses sein.

Die Kombination aus einem Reifegradmodell für die angestrebte Lösung und Repository ist eine wertvolle Unterstützung für das Projektmanagement, da es sowohl die Planung als auch die Kommunikation im Teilprojekt vereinfacht. Dieses Vorgehensmodell lässt sich leicht auf andere komplexere IT-Projekte ausdehnen. SharePoint Projekte sind zum Beispiel ebenso prädestiniert für diese Vorgehensweise.

Donnerstag, 8. Juli 2010

Size matters! Woher bekomme ich größere Testdatenbanken?

Häufig bekomme ich zu hören, dass die Adventure Works Datenbank ja zu klein sei, um mal wirklich Performance Tuning Szenarios im stillen Kämmerlein zu testen.

Ok, zuerst natürlich die Anmerkung, dass wohl die wenigsten in besagtem Kämmerlein auch eine entsprechende Hardware haben, um “echte” Erlebnisse zu haben und damit Erfahrung zu sammeln. Sowas bekommt Ihr nur im Feld!

Aber gut, ich gebe gern zu, dass die Adventure Works Umgebung tatsächlich ein wenig schlank ist. Daher hier ein paar Tipps wie Ihr an wesentlich mehr Daten kommen könnt!

Erst mal die Frage an den Hersteller Microsoft, was dieser uns so bietet? Und siehe da, es gibt eine wesentlich größere Datenbank:

Microsoft Contoso BI-Demodatensatz für die Einzelhandelsbranche

Woher kommen die denn nun? Das ist u. a. das Futter für PowerPivot Demos! :-)

Hey, wer sagt da jetzt, dass ihm der Download zu groß ist? Ihr wolltet doch mehr…

Ach so, es sollen mehr Datensätze aus dem Nix entstehen und zwar genau jetzt! Auch da kann geholfen werden. Es gibt zwar diverse Skripte dafür im Netz, aber die haben wir natürlich nie dann zur Hand, wenn wir diese brauchen. Müssen wir also kurz lernen, wie wir das quasi aus dem Kopf immer wieder schaffen werden.

Es gibt zwar Ansätze mit Schleifen und einzelnen Inserts. Wir wollen das aber mal in einer Query versuchen. Vielleicht wird es auch noch eine Sub-Query.

Rettung naht in Form der master.sys.columns. Wie das jetzt? Nun ja, die ist hoffentlich immer da und hat einige Zeilen. Daher merken:

master.sys.columns

Und? Folgende Query wirft doch gerade mal 659 Zeilen bei mir und da ist auch gar nix nützliches drin!

select COUNT(*)
from master.sys.columns a;

Natürlich sind das jetzt noch zu wenig Zeilen, aber jetzt kommt der zweite Teil zum merken:

cross join

Was? Wozu sollen das denn jetzt taugen? Ok, schaut Euch die folgende Query an:

select COUNT(*) as Anzahl
from master.sys.columns a
cross join master.sys.columns b

Das macht schon mal 434.281 Zeilen bei mir. Und die hier?

select COUNT(*) as Anzahl
from master.sys.columns a
cross join master.sys.columns b
cross join master.sys.columns c

Wow, da kommen nun 286.191.179 Zeilen bei rum. Nur was haben wir damit gewonnen? Den Zähler an den wir unsere Testdaten anhängen können! Nun brauchen wir nur noch kurz eine laufende Nummer. Moment mal, es gibt doch zum Beispiel ROW_NUMBER(). Aber die ist ja vorgesehen für die Over Klausel, aber das lässt sich relativ leicht “aushebeln”. Und mit dem TOP lässt dich die Anzahl genau steuern.

select top 500000
ROW_NUMBER() over( order by a.is_filestream  ) as nummer
from master.sys.columns a
cross join master.sys.columns b
cross join master.sys.columns c

 

ROW_NUMBER() over( order by a.is_filestream  ) as nummer

Hey, jetzt nicht schlapp machen beim merken! Ok? Führen wir mal alles zusammen. Mit der folgenden Query haben wir schon 50.000.000 Zeilen. Mit den Spalten Produkt, Lieferant und Umsatz könnt Ihr wenig spielen.

select
nummer,
N'Produkt'+ CAST( nummer % 100 as nvarchar(15)) as Produkt,
N'Lieferant' + CAST (nummer % 10 as nvarchar(15)) as Lieferant,
CAST(5000+ (nummer % 5000) as money) as Umsatz
into t9
from
(
  select top 50000000
  ROW_NUMBER() over( order by a.is_filestream  ) as nummer
  from master.sys.columns a
  cross join master.sys.columns b
  cross join master.sys.columns c
) x

So, ich hoffe, dass nun der eine oder andere was für sich mitnehmen konnte bzw. nun eine Idee hat, wie aus dem Nix Testdaten entstehen können. Und nun viel Spaß beim Indizieren und passt mir bitte auf, dass Ihr nun nicht produktive Server mit Testdaten flutet!