LEAD und LAG mit T-SQL

Die Funktionen LEAD() und LAG() kennen viele bereits als MDX-Funktionen und wissen, die Möglichkeiten zu nutzen, die diese Funktionen bieten. Seit SQL-Server 2012 stehen diese Funktionen auch in T-SQL für relationale Datenbankabfragen zur Verfügung. Im Folgenden werde ich die Verwendung weiterlesen…

Der widerspenstigen Zähmung: Was tun, wenn berechnete Elemente falsche Werte anzeigen?

Ein berechnetes Element im MDX, das falsche Werte erzeugt? Da muss doch ein Fehler beim Erstellen der Berechnungsformel vorliegen – das war mein erster Gedanke, als ich zum ersten Mal von einem Kunden mit diesem Thema konfrontiert wurde. Dabei handelte es sich um die Berechnung des „Rest obere“/„Rest untere“ in der Pivotnavigation des DeltaMaster. Also kann es kein Fehler bei der Erstellung des MDX sein – schließlich funktioniert es doch in vielen anderen Fällen! weiterlesen…

Kopieren von Analysesitzungen im DeltaMaster-Repository

In einem Kundenprojekt gab es die Anforderung, DAS-Dateien in drei Versionen für Entwicklungs- (DEV), Qualitätssicherungs- (QS) und Produktivsystem (PROD) im DeltaMaster-Repository bereitzustellen. Die besondere Herausforderung war, dass der Übertragungszyklus (von DEV nach QS nach PROD) so gestaltet werden sollte, dass die Rechte-Einstellungen im Repository erhalten bleiben und nicht mit den Rechten eines anderen Systems überschrieben werden.

In diesem Beitrag werden die Faktoren erläutert, die bei einem solchen Vorhaben berücksichtigt werden müssen. Außerdem werde ich den Aufbau des SQL-Scripts darstellen, mit dem jetzt bereits seit mehreren Monaten erfolgreich der Übertragungszyklus bei unserem Kunden ausgeführt wird. weiterlesen…

DeltaMaster Modeler: Individuelle Datenmodellanpassung nach Deploy

Mit dem Release der Version 212 des DeltaMaster Modeler im Herbst 2013 kam ein neues Feature hinzu, das angetreten ist, die immerwährende Kluft zwischen DeltaMaster Modeler und dem SQL Server Business Intelligence Development Studio (BIDS) bzw. den SQL-Server Data Tools (SSDT) zu schließen. Bis dahin war es immer ein Problem, wenn man den Modellierungspfad des Modelers verlassen musste, um im BIDS/SSDT etwas zu implementieren, das über die Modeler-Funktionalität nicht modellierbar gewesen wäre. Mit jedem Deploy wurde diese Anpassung überschrieben und musste mühsam von Hand wieder nachgezogen werden. Aber seit dem Release der Version 212 gehört dies der Vergangenheit an: Anpassungen die über das BIDS/SSDT vorgenommen wurden, können jetzt per XMLA-Script hinterlegt und vom Modeler nach einem Deploy in das Datenmodell eingefügt werden. weiterlesen…

Normierung von Zeitangaben in SQL

In unseren Projekten dreht sich immer alles um die Zeit. Meist geht es darum, die Daten auf Tages-, Monats- oder Jahresebene zu vergleichen und zu analysieren. Vor einiger Zeit hatte ich mit einer etwas spezielleren Anforderung in einem Projekt zu tun, von der ich heute berichten möchte.

Damals ging es um die Darstellung von Messdaten aus einer Spezialanwendung, die innerhalb eines Unternehmens die Verfügbarkeit von Software-Systemen und Servern prüft. Mit dieser Spezialanwendung wird mindestens einmal innerhalb von 15 Minuten geprüft, ob das jeweilige System ansprechbar ist. So wird zum Beispiel geprüft, ob ein SAP-Login erfolgreich durchgeführt werden kann oder ob beim Aufruf einer Web-Anwendung eine bestimmte Seite zurück geliefert wird.
Über eine Schnittstelle erhalten wir die Informationen zu den nicht erfolgreichen Messungen. Anders herum gesagt: immer, wenn ein System während der Verfügbarkeitsprüfung nicht erreichbar ist, bekommen wir einen Datensatz geliefert. Als Zeitangabe erhalten wir ein Feld vom Typ DateTime, in dem auf die Millisekunde genau der Zeitpunkt steht, zu dem die Verfügbarkeitsprüfung stattgefunden hat.
weiterlesen…

Performance-Falle in SCOPE-Berechnung

Dass es zu einem gesuchten Ziel in einer Analysis-Services-Datenbank meist mehrere verschiedene Lösungsansätze gibt, wird wohl jedem, der sich etwas intensiver mit Datenmodellierung auseinandersetzt, bereits bekannt sein. Dass aber diese unterschiedlichen Lösungsansätze einen extremen Laufzeitunterschied haben können (in meinem Beispielfall für diesen Beitrag lag diese Zeit zwischen 15 Minuten und 800 Millisekunden), wurde mir vor einigen Wochen klar, als ich mich daran machte, ein Laufzeitproblem bei einem Kunden näher unter die Lupe zu nehmen. weiterlesen…

Vereinigungsmenge à la MDX

Vor einigen Wochen hatte ich einen Supportfall, bei dem es darum ging, in einer Pivottabelle die Eigenschaftsfilter mehrerer Dimensionen zu kombinieren. Auf der Zeilenachse sollten die unterschiedlichen Lieferbeziehungen zwischen Lieferanten und Empfängern dargestellt werden. Anforderung war nun, dass aus der Menge der Lieferanten ein bestimmter Lieferant anhand des Namens herausgefiltert werden sollte. Kein Problem: Dafür haben wir im DeltaMaster ja den Elementeigenschaftsfilter – damit war diese Aufgabe in kürze erledigt. Aber die Anforderung war noch nicht zu Ende, denn es sollte gleichzeitig auch die Menge der Empfänger nach dem gleichen Namen gefiltert und mit der Ergebnismenge des ersten Filters kombiniert werden.
Aus der Mengenlehre kennt man den Begriff der Vereinigungsmenge – dazu gibt es auch eine entsprechende MDX-Funktion: UNION().
Um dieses Beispiel nun unabhängig von den Daten des Kunden zu veranschaulichen, werde ich zur weiteren Erklärung der UNION-Funktion auf unsere Chair-Datenbank zurückgreifen. Analog zu der geschilderten Problemstellung ist auf der Chair-DB folgendes Szenario denkbar:
Es soll ein Spezialbericht erstellt werden, der die Umsatzergebnisse nach Kunden geordnet pro Einzelprodukt darstellt. Dabei soll die Menge der Kunden über einen Elementeigenschaftsfilter eingeschränkt werden, so dass nur ein Kunde und alle dort erzielten Umsätze dargestellt werden. Gleichzeitig soll aber auch ein bestimmtes Produkt angezeigt werden, dieses aber wiederum für alle Kunden.
Der Kundenname soll „Walter“ enthalten – das/die gesuchte(n) Produkt(e) die Bezeichnung „Discus“. weiterlesen…

Formatierte HTML-Mails direkt aus SSIS-Paketen abschicken (Teil 1)

Für das Versenden von Mails gibt es im SSIS eine spezialisierte Task, die das übernehmen kann. Sie ist sehr einfach zu konfigurieren und leistete in der Vergangenheit auch in meinen Kundenprojekten gute Dienste, wenn es zum Beispiel darum ging, mal schnell eine Info in die Welt zu senden und mitzuteilen, dass ein Import nicht erfolgreich gelaufen ist. Kürzlich kam einer der Mailempfänger auf mich zu und fragte, ob mit der Fehlermeldung nicht auch gleich der Inhalt einer Log-Tabelle mit gesendet werden kann. Dann könnte er als Administrator auf einen Blick sehen was los ist und müsste nicht erst selbst die Log-Tabelle abfragen, um zu sehen, was denn schief gegangen ist.
Eigentlich ein guter Gedanke – aber auch gleichzeitig ein Problem: Mit dem SSIS-Task für das Versenden von Mails kann nur reiner Text versendet werden. Um eine Tabelle mit in den Mailtext zu packen, müsste man aber schon die Möglichkeit haben, den Text im HTML-Format zu senden. Und hier kommt ein Lösungsansatz, der dies möglich macht. weiterlesen…

Mit Bulk Copy & Co. am Log vorbei

Das kopieren von Massendaten in einer SQL-Server Datenbank kann man ganz schön viel Zeit in Anspruch nehmen. Um Daten von einer Tabelle in eine andere zu schieben – zum Beispiel um Erweiterungen an einer Faktentabelle vorzunehmen – können einige Stunden ins Land ziehen. Ganz abgesehen von dem nicht unerheblichen Speicherbedarf für das Log-File.
Vor kurzem hatte ich einen Fall, bei dem es genau darauf ankam: Über 200 Mio. historisierte Datensätze in einer Faktentabelle, die wegen einer Erweiterung des Datenmodells “im Weg” waren. Nach der Anpassung des Datenmodells mit dem Modeler dauerte es fast einen ganzen Tag, bis die Daten mit der INSERT-Anweisung von der Faktentabelle in eine temporäre Tabelle und wieder zurück gespielt waren. Für die lange Laufzeit war hauptsächlich das Log-Verhalten des SQL-Servers verantwortlich.
Heute möchte ich ein paar Möglichkeiten vorstellen, wie Daten aus einer Tabelle heraus übertragen werden können, ganz ohne eine Spur im Datenbank-Log. weiterlesen…

SSAS 2008 R2: Best Practices

Auf die Frage: “Ist es schwierig ein SSAS-Datenmodell von SSAS 2005 auf SSAS 2008 R2 zu überführen?” hätte ich noch vor einer Woche gesagt, dass dies so gut wie kein Problem darstellt. Einfach das Backup vom SSAS 2005 her nehmen und im SSAS 2008 R2 wieder einspielen – fertig! So geht das zumindest in der Werbung. Aber das wahre Projektleben sieht anders aus… und deshalb soll dieser Beitrag als Grundlage für zukünftige Projekte dienen, bei denen SSAS 2008 R2 zum Einsatz kommt.
Übrigens: In diesem Beitrag gibt es auch viele Tips und Links die auch die anderen (aktuellen) SSAS-Versionen betreffen… lesen lohnt sich! weiterlesen…