Performance ist eins der Hauptargumente, SQLScript einzusetzen. Denn mit der Einführung der HANA-Datenbank hat SAP das „Code Pushdown“-Konzept eingeführt. Bei diesem neuen Paradigma werden zeitintensive Berechnungen mit hohem Datenvolumen auf die Datenbankebene delegiert. Mithilfe von SQLScript haben Sie systemeigenen Zugriff auf die HANA-Datenbank und können unnötige Datenübertragungen zwischen Datenbank und Anwendungsserver vermeiden.
Allerdings können Sie auch Ihren SQL Code so gestalten, dass die Programme sehr langsam laufen. Daher stellen wir in diesem Artikel bewährte Tipps vor, um eine hohe SQLScript Performance zu erreichen.
Eine hohe Performance ist eher erreichbar, wenn man mit einer kleinen Datenmenge arbeitet. Schränken Sie daher das Datenvolumen möglichst früh ein und selektieren Sie nur die Daten, die Sie wirklich brauchen. Ein Paar einfach zu folgende Regeln unterstützen Sie dabei:
Gewöhnen Sie sich an, die Spalten einer Tabelle immer explizit zu selektieren. Anstatt also einfach alles auszuwählen, wie in der folgenden Anweisung …
SELECT * FROM Customers;
… sollten die benötigten Spalten in die Anweisung aufnehmen:
SELECT
CustomerName,
City
FROM
Customers;
Neben der expliziten Auswahl der Spalten sollten Sie auch immer die WHERE Klausel in Ihre SELECT Anweisungen integrieren. Diese wird zum Filtern der Daten verwendet. So werden nur die Datensätze extrahiert, die eine bestimmte Bedingung erfüllen. Denn oft wird für die Berechnungen nur eine Teilmenge aller vorhandenen Daten benötigt.
SELECT
CustomerName,
City
FROM
Customers
WHERE
Country='Germany';
Beachten Sie bitte, dass die HAVING Klausel nicht dieselbe Wirkung hat. Während die WHERE Klausel die Datenmenge bei der Selektion reduziert, bildet die HAVING Klausel einen Filter auf die bereits gruppierten und aggregierten Daten. Daher kann die HAVING Klausel nicht zur Performanceverbesserung eingesetzt werden.
Wenn Sie zuvor mit ABAP gearbeitet haben, kümmern Sie sich nicht weiter um den Mandanten, da dieser in OpenSQL implizit ausgewählt wurde. Bei SQLScript dagegen müssen Sie den gewünschten Mandanten immer explizit definieren.
Indem Sie die Daten anderer Mandanten ausfiltern, steigern Sie die Performance. Dies gilt vor allem bei Joins. Falls der Mandant nicht definiert wird, wird beim Ergebnis das kartesische Produkt aller Mandanten verwendet.
Bei der Verarbeitung von SQLScript Abfragen verwendet die SAP HANA verschiedene Engines. Grundsätzlich kann man zwischen Row (Zeilen) Engine und Column (Spalten) Engine unterscheiden. Diese sind auf verschiedene Aufgaben spezialisiert. Um eine möglichst hohe Leistung zu erreichen, sollten Sie es vermeiden, in Ihrem Code zwischen den Engines zu wechseln.
So findet die zeilenweise Verarbeitung, zum Beispiel im Falle einer Window Funktion, in der Row Engine statt. Dagegen werden die Joins, Aggregationen und Berechnungen in der Column Engine ausgeführt. Wenn bei der Ausführung einer Abfrage zwischen den Engines gewechselt werden muss, müssen die Daten materialisiert werden. Dies geht zu Lasten der Performance.
Genauso wie den Wechsel zwischen Row und Column Engine sollten Sie den Wechsel zwischen deklarativen und imperativen Anweisungen vermeiden. Dies liegt daran, dass nur deklarative Anweisungen von SAP HANA optimiert werden können. Daher sollten Sie diese bevorzugt verwenden und imperative Anweisungen vermeiden.
Worin unterscheiden sich deklarative und imperative Anweisungen? Bei deklarativen Anweisungen sagen Sie dem System, welche Daten Sie gerne hätten. Das System findet selbstständig den besten Weg, um Sie mit den Daten zu versorgen. Bei imperativen Anweisungen dagegen sagen Sie ausdrücklich, wie das System die Daten liefern soll. Allerdings beschränkt dieses “Micromanagement” auch das Potential des Systems, die Ausführung zu optimieren.
Zu deklarativen Anweisungen zählen SELECT, JOIN, WHERE sowie Klauseln wie WITH, GROUP BY, HAVING, ORDER BY und auch die vordefinierten Funktionen wie MAP. Imperative Anweisungen umfassen FOR und WHILE LOOP sowie IF ELSE Verzweigungen.
Während Schleifen generell schlecht für Performance sind, kann es noch schlimmer machen, indem man Data Manipulation Language (DML) Anweisungen innerhalb der Schleifen ausführt. Dazu zählen alle Anweisungen, die Daten in Tabellen lesen oder ändern. Zum Beispiel SELECT, INSERT, UPDATE oder DELETE.
Statt Daten innerhalb der Schleifen einzufügen oder zu löschen, versuchen Sie nach Möglichkeit, die Anpassungen zu bündeln und dann mit einer einzigen Anweisung auszuführen.
Im Gegensatz zur Tabellenfunktion liefert die skalare Funktion einen skalaren (d. h. einen einzelnen) Wert zurück. Grundsätzlich schneiden die skalaren Funktionen bei der Performance schlechter ab. Die schlechte Performance kann vor allem bei großen Datenmengen zum Schein kommen. Vor der Produktivsetzung sollten Sie daher einen Performancetest mit ausreichend großer Datenmenge ausführen.
Darüber hinaus sollten Sie aus Performancegründen keine SELECT Abfragen in skalaren Funktionen ausführen. Diese werden sehr oft ausgeführt, was zur Lasten der Performance geht. Beachten Sie bitte, dass auch Zugriffe auf die DUMMY Tabelle darunter fallen.
Wenn Ihre skalare Funktion bei konstanten Eingabeparametern immer dasselbe Ergebnis liefert, können Sie mit dem Schlüsselwort DETERMINISTIC die Pufferung einschalten. Dieses wird nach der Definition der Parameter angegeben. Die Pufferung ist vor allem bei Funktionen mit binären Ergebnissen sinnvoll. Wenn Sie unterschiedliche Ergebnisse erwarten, sollte DETERMINISTIC nicht verwendet werden, da wegen dem Caching die Performance unter Umständen sogar schlechter sein kann.
Nun kennen Sie die typischen Fallstricke und wie Sie diese vermeiden können. Halten Sie sich an unsere Richtlinien und holen Sie das meiste aus Ihren SQLScript Programmen heraus!
Haben Sie Fragen zu SAP HANA SQLScript? Versuchen Sie das nötige Know-How in Ihrer Abteilung aufzubauen oder benötigen Sie Unterstützung bei einer konkreten Fragestellung? Wir helfen Ihnen gerne dabei. Fordern Sie noch heute ein unverbindliches Beratungsangebot an!