Wer regelmäßig mit SAP Datasphere arbeitet, kennt das Phänomen. Eine View liefert nicht die erwarteten Ergebnisse oder läuft quälend langsam. In den meisten Fällen lässt sich die Ursache schnell auf einen Anwenderfehler oder ein Missverständnis der SQL-Logik zurückführen. Doch was tun, wenn man alle naheliegenden Ursachen ausgeschlossen hat und das Problem hartnäckig bestehen bleibt? In diesem Beitrag schaffen wir Abhilfe.
In 99% der Fälle ist die Problemursache vor dem Monitor zu finden. In den allermeisten Fällen handelt es sich hierbei um einen Anwenderfehler oder ein fehlendes Verständnis der zugrunde liegenden SQL-Logik. Bei dem verbleibenden 1 % handelt es sich jedoch um ein schwerwiegendes Problem, das auf einen Bug im HANA Database (DB) Query Optimizer zurückzuführen ist.
Zum Glück tritt der Fehler nur selten auf. Nach fünf Jahren intensiver Arbeit mit SAP Datasphere und HANA sowie dutzenden erfolgreich umgesetzten Projekten trat der Fehler nur drei - vier Mal auf. Dennoch möchten wir unsere Erfahrungen teilen, wie Sie in solchen Ausnahmefällen reagieren können.
Zunächst gehen wir auf die zugrundeliegende Ursache ein und zeigen auf, wie Sie Database Hints nutzen können, um das Problem zu lösen. Dabei zeigen wir eine bisher nicht dokumentierte Lösung in Datasphere, die es erlaubt, Database Hints in Datasphere Objekten zu nutzen.
Die Anomalie wird durch einen Bug im HANA Database Optimizer verursacht. Die Datenbank wählt manchmal eine mathematische „Abkürzung“, die allerdings für den spezifischen Datenkontext logisch unzulässig ist. So werden zum Beispiel Beträge vor der Währungsumrechnung aggregiert, was zu falschen Ergebnissen führt. Dieses Phänomen tritt auf, wenn der Optimizer fälschlicherweise einen „Aggregation Pushdown“ forciert. Bei der Währungsumrechnung ist dies jedoch ein Trugschluss. Da Wechselkurse variabel sind und pro Datensatz (z. B. nach Tagesdatum) variieren können, führt eine Summenbildung vor der Umrechnung zur falschen Summe. Der Optimizer „opfert“ hierbei die semantische Korrektheit zugunsten einer vermeintlich höheren Performance durch Reduzierung der zu verarbeitenden Zeilenanzahl.
Um sicherzustellen, dass HANA die Schritte in der korrekten Reihenfolge ausführt, also zuerst die Währungsumrechnung durchführt und erst danach die Werte aggregiert, können Sie sogenannte Datenbank Hints nutzen. Diese erlauben es Ihnen, die automatische Auswahl des SQL-Optimierers gezielt zu überschreiben und einen fest definierten Ausführungsplan für die Abfrage zu erzwingen.
Einführung
Datenbank-Hints in SAP HANA sind spezifische Anweisungen, die genutzt werden, um das Standardverhalten des SQL-Optimierers zu beeinflussen oder zu erzwingen. Normalerweise entscheidet der Optimierer, basierend auf Statistiken und Heuristiken, selbständig, welcher Ausführungsplan (z. B. welche Engine genutzt wird oder wie die Joins erfolgen sollen) am effizientesten ist. Ein Hint kommt dann zum Einsatz, wenn diese automatische Entscheidung - wie im Fall der fehlerhaften Vor-Aggregierung - zu suboptimaler Performance oder logisch falschen Ergebnissen führt.
Syntax
Bei SQL Statements werden die Hints am Ende nach der WITH HINT-Klausel platziert. Zum Beispiel, wenn wir es mit Massen-Aggregationen zu tun haben, und die OLAP Engine nutzen wollen, können wir USE_OLAP_PLAN nutzen.
SELECT * FROM TABLE1 WITH HINT( USE_OLAP_PLAN );
Bei CDS Views werden die Hints im Header definiert. Zum Beispiel:
@Consumption.dbHints: ['USE_OLAP_PLAN']
Auch bei Datasphere Artefakten wie Analytischen Modellen können Sie Datenbank Hints im folgenden Format definieren:
"@Analytics.dbHints": [
{
"engine": "SQL",
"hints": [
{
"key": "NO_PREAGGR_BEFORE_CONVERT_CURRENCY",
"value": "true"
}
]
}
]
Wie genau Sie es einbinden können, erfahren Sie im nächsten Kapitel.
Neben den Ausführungs-Engines (OLAP, HEX, ESX) können Sie auch spezielle Verhaltensweisen beeinflussen. So können Sie zum Beispiel mit den Hints CS_AGGR und NO_CS_AGGR die Column Store Aggregation steuern. CS_AGGR Hint weist den Optimizer an, die Aggregation so weit wie möglich direkt in der Column Engine durchzuführen. Anstatt die Daten Zeile für Zeile auszulesen, werden ganze Spaltenblöcke gleichzeitig aggregiert.
Allerdings kann diese Optimierung bei komplexen benutzerdefinierten Funktionen oder speziellen Join-Bedingungen zu fehlerhaften Ergebnissen führen. In diesem Fall können Sie mit NO_CS_AGGR erzwingen, dass die Aggregation nicht in der Column Engine stattfindet.
Eine vollständige Liste der DB Hints können Sie unter SAP HANA SQL Reference Guide for SAP HANA Platform sowie in der SAP Note 2142945 - FAQ: SAP HANA Hints finden.
Wie finden Sie aber aus der ellenlangen Liste der Hint, der Ihr Problem löst? Leider gleicht die Suche nach dem richtigen Datenbank-Hint oft methodischer Detektivarbeit. Zwar weist SAP in der Note 2142945 - FAQ: SAP HANA Hints auf spezifische Bugs hin, die der eine oder andere Hint lösen kann. Allerdings deckt die Note bei weitem nicht alle Fehler ab, die im Projektalltag auftreten können.
Ein systematischer Ansatz besteht darin, den SQL Execution Plan (PlanViz) der fehlerhaften Abfrage mit dem Plan einer manuell korrigierten Version zu vergleichen. Indem man eine äquivalente Abfrage erstellt, die beispielsweise durch einen Hint die logisch richtige Reihenfolge erzwingt, erhält man ein Referenzmodell. Der direkte Vergleich der Plan-Schritte im SAP HANA PlanViz offenbart dann oft die problematische Stelle.
Zum Schluss möchten wir Ihnen zeigen, wie wir das Problem mit der fehlerhaften Währungsumrechnung gelöst haben. Nach einer ausführlichen Analyse und mit Unterstützung der SAP mussten wir unser Analytisches Modell mit dem DB Hint NO_PREAGGR_BEFORE_CONVERT_CURRENCY versehen.
Exportieren Sie dazu die CSN-/JSON-Definition des Objekt in Datasphere Data Builder.
Öffnen Sie die Datei im Editor Ihres Vertrauens, z.B. Notepad++. Hier können Sie die Objektdefinition im JSON Format sehen.
Fügen Sie die folgende JSON Notation in die Definition von Ihrem Analytischen Modell ein:
"@Analytics.dbHints": [
{
"engine": "SQL",
"hints": [
{
"key": "NO_PREAGGR_BEFORE_CONVERT_CURRENCY",
"value": "true"
}
]
}
],
Schließen Sie nun das Objekt und wechseln Sie zu dem Hauptbildschirm von Data Builder. Hier können Sie die angepasste JSON Datei importieren.
Details zu dem Vorgehen finden Sie in unserem Artikel SAP Datasphere JSON Hack: Umwandlung grafischer Views in SQL Views.
Fehlerhafte Abfrageergebnisse in SAP Datasphere liegen meist an der fehlerhaften Anwendung - doch wenn der HANA Optimizer streikt, ist technisches Fachwissen gefragt. Dabei bieten Database Hints den entscheidenden Hebel, um die Datenintegrität bei Bugs wie der fehlerhaften Vor-Aggregation zu gewährleisten. Durch den vorgestellten JSON-Hack lassen sich diese Korrekturen nun auch direkt in Datasphere-Objekten umsetzen. Nutzen Sie diesen Workaround als Joker für die wirklich hartnäckigen Fälle.
Stehen Sie vor ähnlichen Herausforderungen in Ihrem Datasphere-Projekt oder benötigen Sie Unterstützung bei der Analyse komplexer Performance- und Logikprobleme? Kontaktieren Sie uns - wir freuen uns darauf, gemeinsam mit Ihnen die passende Lösung zu finden.