Sie verwenden keine aktuelle Browser-Version. Deshalb wird die Webseite möglicherweise nicht korrekt dargestellt. Hier finden Sie weitere Hinweise.

Best Practices mit SQLScript

SAP S/4HANA Featured Image

Inhaltsverzeichnis

Die Einführung von SAP HANA hat zu einem Paradigmenwechsel der Systemlandschaft geführt. Der datenbankunabhängige und applikationsgetriebene Ansatz der alten Systeme ist mit SAP S/4HANA und SAP BW/4HANA Vergangenheit. Mit SAP HANA ergibt sich eine neue Welt der Modellierungsmöglichkeit, die eine zentrale Sprache hat: SQLScript. Dabei handelt es sich um eine SAP-eigene Abwandlung von SQL mit spezifischen Befehlen und Besonderheiten. Durch die Verwendung von SQLScript wird die datenintensive Logik nicht über den Applikationsserver ausgeführt, sondern direkt auf der modernen In-Memory Plattform. Dieser Ansatz wird oft als „Push Down“ oder „Code to Data“ beschrieben und ermöglicht sowohl virtuelle als auch performante Business Logik.

In diesem Blog werfen wir einen Blick auf die Eigenheiten von SQLScript und geben Tipps, wie SQLScript optimiert werden kann. Die datenbanknahe Modellierung mit SQLScript findet Anwendung in diversen Bereichen der Systeme:

  • AMDP in Transformationen von SAP BW/4HANA (oder on HANA)
  • ABAP CDS Views basierend auf AMDP Funktionen
  • TableFunctions und Datenbankprozeduren in SAP HANA XSC/XSA
  • SQL Views in DWC

Bei der Vielzahl an Möglichkeiten SQLScript bei der Modellierung von Logik einzusetzen, wird die Relevanz der Sprache offensichtlich und der Bedarf an Optimierungspotenzial steigt kontinuierlich. Auch die neuen Applikationen von SAP wie HANA XSA oder DWC zeigen einen klaren Fokus auf SQLScript, durch die Verwendung der entsprechenden Artefakte.

Grundaufbau SQLScript

Wie im SQL Standard besteht SQLScript hauptsächlich aus SELECT-Statements, die Daten aus den Quellen selektieren und weiterverarbeiten, wobei alle gängigen Funktionen aus dem Standard SQL vorhanden sind. Eine große Besonderheit von SQLScript stellen die temporären Tabellen dar. Diese können mit Common Table Expressions (CTE) verglichen werden und ermöglichen die Wiederverwendung von SELECT-Statements.

Abbildung 1: CTE vs. temporäre Tabelle

Im klassischen, deklarativen SQL ist es nur möglich ein SELECT-Statement zu schreiben, welches durch Sub-SELECTs oder CTEs verbunden ist. In SQLScript hingegen besteht die Möglichkeit durch die temporären Tabellen eine Art imperativen Aufbau des Statements herzustellen. Dabei ist es wichtig zu verstehen, dass nicht jede temporäre Tabelle zur Gänze ausgeführt wird, sondern das Statement durch den HANA-Optimizer komprimiert wird und ein optimaler Ausführungsplan erstellt wird. Daher kann das Statement, das tatsächlich ausgeführt wird, wieder aus CTEs bestehen, obwohl diese zunächst nicht ersichtlich sind.

Es sei auch erwähnt, dass mit SQLScript gänzlich imperative Sprachelemente wie IF…ELSE oder FOR-Schleifen möglich sind. Allerdings sollten diese im Allgemeinen vermieden werden, da der Ausführungsplan gestört wird und die Optimierung nicht ideal sein könnte. Dennoch ermöglichen temporäre Tabellen auch bei der imperativen Logik einen Vorteil.

Somit nehmen temporäre Tabelle in SQLScript eine zentrale Rolle ein. Zusätzlich stellt SAP eine Reihe von besonderen Operationen bereit, welche die Arbeit mit temporären Tabellen weiter erleichtern und sogar noch performanter machen. Im folgenden Kapitel gehen wir auf diese Spezialbefehle ein und erklären sie an Beispielen.

Arbeit mit temporären Tabellen

Benennung und Kommentare

Wie bei allen Programmiersprachen empfiehlt es sich, eine gute und übersichtliche Form zu wahren. Dazu gehört zum einen die sprechende Benennung von Variablen und zum anderen die Verwendung von Kommentaren. Bei den temporären Tabellen hat sich ähnlich zu ABAP die Verwendung von Präfixen als vorteilhaft erwiesen, da der Typ direkt ersichtlich wird und auch zwischen lokalen, Eingangs- und Ausgabe-Tabellen unterschieden werden kann.

Abbildung 2: Benennung und Kommentare

Da SQLScript hauptsächlich aus SELECT Statements besteht, empfiehlt es sich, über die Kommentare zu beschreiben, warum eine Quelle selektiert wird. Kommentare wie „Select data from table xyz“ sind oft nicht hilfreich, da die Verwendung der Daten relevanter ist.

Modifikation

Die Datenzusammenführung nimmt bei der Datenverarbeitung eine zentrale Rolle ein, da häufig aus verschiedenen Quellen die Daten harmonisiert und zusammengetragen werden müssen. Oftmals wird für die Vereinigung dabei der Befehl „UNION (ALL)“ verwendet. Für temporäre Tabellen kann dies allerdings mit dem Befehl INSERT eleganter und performanter gelöst werden.

Abbildung 3: INSERT anstatt UNION

Dabei kann der INSERT-Befehl auf zwei Arten verwendet werden: Entweder ist der Input eine strukturgleiche Tabelle oder über direkte Einzelwerte.

Bei großen Datenverarbeitungen kann es sinnvoll sein, nicht mehr verwendete temporäre Tabellen zu leeren, sodass der Speicher frei wird. Dies kann mit DELETE effizient implementiert werden. Bei diesem Befehl ist es möglich die gesamte Tabelle zu leeren, oder nur bestimmte Zeilen.

Abbildung 4: DELETE

Zugriff auf Elemente

Sehr oft wird auf bestimmte Elemente einer Tabelle zugegriffen, z.B. auf eine Spalte der ersten Zeile. In SQL wird dafür meistens der Befehl LIMIT oder TOP mit einer entsprechenden Sortierung verwendet. Bei temporären Tabellen können einzelne Elemente allerdings direkt ausgelesen werden, auch mit einer Schlüsselsuche.

Abbildung 5: Zugriff auf Elemente

Bei komplizierteren Abfragen auf ein bestimmtes Element kann mit INTO der Wert in eine Variable geschrieben werden. Dabei sollte immer der DEFAULT-Wert mitgegeben werden, wodurch ein SQL-Fehler vermieden wird, falls ein entsprechender Eintrag nicht gefunden wird.

Abbildung 6: INTO mit DEFAULT

Anzahl Datensätze

Die Frage nach der Anzahl der Datensätze in einer Tabelle oder Datenmenge ist eine häufige Anforderung, die im klassischen SQL mit COUNT(*) beantwortet wird. SQLScript bietet dafür eine elegantere Möglichkeit. Die Datensatzanzahl kann auch direkt in Schleifen verwendet werden.

Abbildung 7: IS_EMPTY und RECORD_COUNT

Wie zu erkennen ist, kann mit IS_EMPTY direkt geprüft werden, ob eine temporäre Tabelle Daten enthält. Das Ergebnis von RECORD_COUNT kann auch in eine Variable für die weitere Verwendung geschrieben werden.

Fazit

Durch das Hinzufügen von eigenen Sprachelementen ermöglicht SAP mit SQLScript eine Vielzahl an neuen Modellierungsmöglichkeiten im Gegensatz zu klassischem SQL. Die spezifischen Befehle für den Umgang mit temporären Tabellen sollten verwendet werden, um die gesamte Performance der HANA Datenbank zu nutzen.

Viele Kunden und Entwickler von S/4HANA oder BW/4HANA Systemen stehen nun allerdings vor der Frage, ob sie ihre Logik mit SQLScript oder ABAP-Techniken umsetzen sollen. Auf diese Frage gehen wir in einem folgenden Blog-Beitrag ein, bei dem es um eine Gegenüberstellung von ABAP und SQLScript bzw. AMDP geht und wie eine effiziente Umwandlung von ABAP zu AMDP möglich ist.

Nehmen Sie Kontakt zu uns auf!

    Mit der Erhebung, Verarbeitung und Nutzung meiner personenbezogenen Daten zur Bearbeitung meiner Anfrage erkläre ich mich einverstanden. Ich kann mein Einverständnis jederzeit ohne Angabe von Gründen widerrufen. Weitere Informationen finden Sie in unserer Datenschutzerklärung.

    Kostenloses Factsheet

    • Welche Vorteile bietet RISE with SAP?
    • Was ist Bestandteil des Servicepakets?
    • Welche Tools und Services helfen Ihnen?
    • Was ist SAP Business Process Intelligence?
    • Wie bringen Sie Ihr ERP effizient in die Cloud?
    • Wie kann Nagarro Sie unterstützen?