NextLytics Blog

Performance Analyse und Optimierung von SAP SQL

Geschrieben von Sebastian Uhlig | 20.04.2023 09:53:46

Es existieren verschiedene Möglichkeiten zur Analyse der SQLScript Performance. In diesem Artikel lernen Sie die relevanten Werkzeuge kennen. Wir zeigen Ihnen, wie Sie die Laufzeit von Ihren SQL Abfragen messen können, was als erstes Indiz für die Performance dienen kann. Anschließend erläutern wir, wie Sie mithilfe des Ausführungsplans herausfinden, welcher Teil des Codes am längsten braucht.

Mit dem PlanViz Tool können Sie sich den Ausführungsplan auch grafisch anschauen und einzelne Schritte analysieren. Diese Möglichkeit besteht sowohl bei Eclipse bzw. HANA Studio als auch in den web-basierten Frontends wie SAP Business Application Studio. Schließlich zeigen wir Ihnen, wie Sie mit dem SQLScript Code Analyzer Ihre Prozeduren und Funktionen scannen und Verbesserungsvorschläge generieren können.

Unsere Blogreihe "SQLScript Performance Analyse" im Überblick

  1. Performance Analyse und Optimierung von SAP SQL

  2. SQL Performance Analyse mit SAP PlanViz 

  3. Wie Sie die Performance Ihrer SQL Funktionen steigern 

 

Laufzeitmessung

Die Laufzeit einer SQL Abfrage kann als erster Anhaltspunkt für die Performance des Scripts verwendet werden. Vor allem wenn Sie zwei ähnliche Abfragen vergleichen, ist die Abfrage mit der niedrigeren Laufzeit die performantere.

Beachten Sie dabei, dass die Laufzeit eines SQLScripts auch von der allgemeinen Serverbelastung abhängt und daher schwanken kann. Um repräsentative Ergebnisse zu erhalten, sollten Sie daher den SQLScript mehrmals ausführen und anschließend die Messergebnisse vergleichen.

Betrachten wir das folgende Beispiel, welches wir in unserem Beitrag “So nutzen Sie Window Functions in SQLScript” vorgestellt haben. Als erstes führen wir die Abfrage mit der WHERE Klausel aus.

SELECT

    cost."ZDRCOSTLINEITEMID",

    ccgrp."ZDRCOSTCENTREGROUPTEXT",

    ccitem."ZDRCOSTCENTREITEMTEXT",

    cost."CURRENCY",

    cost."COST",

    cost."COSTBOOKINGDATE",

-- regular aggregations

    MAX("COST") OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT") as "MAX",

    ROUND(AVG("COST") OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT"), 0) as "AVG",

    COUNT(*) OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT") as "COUNT",

-- special functions

    LEAD(cost."COSTBOOKINGDATE", 1) OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT" ORDER BY ccitem."ZDRCOSTCENTREITEMTEXT", cost."COSTBOOKINGDATE") as "LEAD",

    DENSE_RANK() OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT" ORDER BY cost."COST" DESC) as "D_RANK",

    ROW_NUMBER() OVER (PARTITION BY ccitem."ZDRCOSTCENTREITEMTEXT" ORDER BY cost."COSTBOOKINGDATE") as "ROWNUM"    

FROM

    ZDRCOSTCENTREGROUP as ccgrp

    left join

    ZDRCOSTCENTREITEM as ccitem on ccgrp."ZDRCOSTCENTREGROUPID" = ccitem."ZDRCOSTCENTREGROUPID"

    left join

    ZDRCOSTLINEITEM as cost on ccitem."ZDRCOSTCENTREITEMID" = cost."ZDRCOSTCENTREITEMID"

WHERE

    ccgrp."ZDRCOSTCENTREGROUPTEXT" = 'Administration'

ORDER BY

    ccitem."ZDRCOSTCENTREITEMTEXT", cost."COSTBOOKINGDATE";

In der SQL Konsole werden die Laufzeit und die Anzahl der selektierten Zeilen ausgegeben.

Nun führen wir dieselbe Abfrage ohne WHERE Klausel aus. Es werden also alle Daten selektiert. Anhand der SQL Konsole können wir sehen, dass die Laufzeit knapp das Doppelte beträgt. Wobei die Server-Verarbeitungszeit verzehnfacht wird. Es werden auch zehnmal so viele Zeilen selektiert.

Ausführungsplan generieren

Mit dem Befehl EXPLAIN PLAN können Sie einen Ausführungsplan Ihrer SQL Abfrage in tabellarischer Form generieren. Dabei wird eine Liste von Operatoren angezeigt, die von der Datenbank zum Ausführen der Abfrage verwendet werden, sowie ergänzende Informationen über diese. So können Sie herausfinden, welche Operatoren für die lange Laufzeit verantwortlich sind. Diese Information kann verwendet werden, um die Abfrage zu optimieren, indem Sie zum Beispiel die Laufzeit oder den Speicherverbrauch reduzieren.

Der Ausführungsplan kann mit der folgenden Syntax generiert werden:

EXPLAIN PLAN [SET STATEMENT_NAME = *<statement_name>*] FOR SELECT *<subquery>*

Wenn Sie das Statement spezifizieren, wird das Ergebnis in der Tabelle explain_plan_table gespeichert.

EXPLAIN PLAN SET STATEMENT_NAME = 'MyStatement01' FOR

SELECT

    cost."ZDRCOSTLINEITEMID",

    ccgrp."ZDRCOSTCENTREGROUPTEXT",...

Dieses kann anschließend ausgelesen werden:

SELECT * FROM

explain_plan_table

WHERE

           statement_name = 'MyStatement01'

Alternativ kann der Ausführungsplan auch direkt bei der Ausführung erstellt werden, indem Sie den Parameter SET STATEMENT_NAME weglassen. Der Ausführungsplan wird im Result Fenster angezeigt. Sie können auch mehrere durch ein Semikolon getrennte Abfragen eingeben, um mehrere Ausführungspläne gleichzeitig zu generieren.

EXPLAIN PLAN FOR

SELECT

    cost."ZDRCOSTLINEITEMID",

    ccgrp."ZDRCOSTCENTREGROUPTEXT",

    ccitem."ZDRCOSTCENTREITEMTEXT",

    cost."CURRENCY",

    cost."COST",

    cost."COSTBOOKINGDATE",

-- regular aggregations

    MAX("COST") OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT") as "MAX",

    ROUND(AVG("COST") OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT"), 0) as "AVG",

    COUNT(*) OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT") as "COUNT",

-- special functions

    LEAD(cost."COSTBOOKINGDATE", 1) OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT" ORDER BY ccitem."ZDRCOSTCENTREITEMTEXT", cost."COSTBOOKINGDATE") as "LEAD",

    DENSE_RANK() OVER (PARTITION BY ccgrp."ZDRCOSTCENTREGROUPTEXT" ORDER BY cost."COST" DESC) as "D_RANK",

    ROW_NUMBER() OVER (PARTITION BY ccitem."ZDRCOSTCENTREITEMTEXT" ORDER BY cost."COSTBOOKINGDATE") as "ROWNUM"    

FROM

    ZDRCOSTCENTREGROUP as ccgrp

    left join

    ZDRCOSTCENTREITEM as ccitem on ccgrp."ZDRCOSTCENTREGROUPID" = ccitem."ZDRCOSTCENTREGROUPID"

    left join

    ZDRCOSTLINEITEM as cost on ccitem."ZDRCOSTCENTREITEMID" = cost."ZDRCOSTCENTREITEMID"

WHERE

    ccgrp."ZDRCOSTCENTREGROUPTEXT" = 'Administration'

ORDER BY

    ccitem."ZDRCOSTCENTREITEMTEXT", cost."COSTBOOKINGDATE";

 

Steigern Sie die Leistung Ihres BW mit SQLScript!
Hier geht es zum Whitepaper!

Alternativ können Sie in Eclipse einen Rechtsklick auf dem Code ausführen und Explain Plan aus dem Menü auswählen.

Im SAP HANA Database Explorer finden Sie diese Option unter dem Analyze Dropdown-Menü.

PlanViz

Explain Plan liefert erste Ansätze zur Performance Analyse. Allerdings existiert meiner Meinung nach ein viel besseres Werkzeug, welches Explain Plan überflüssig macht - PlanViz. Im Gegensatz zu Explain Plan stellt PlanViz die Ausführungsschritte grafisch dar, was die Analyse erheblich erleichtert. Nach der anfänglichen Analyse der aggregierten Schritte können Sie tiefer in die Details abtauchen und sich die einzelnen Operatoren ansehen.

Dabei geht die tabellarische Darstellung nicht verloren. PlanViz bietet neben der grafischen Sicht fünf weitere tabellarische Ansichten. In diesen können Sie Details zu Timeline, Operatoren, Tabellen und Performance sowie Netzwerk einsehen.

Da es sich um ein wirklich mächtiges und umfangreiches Tool handelt, haben wir weiterführende Informationen in einem separaten Artikel zusammengefasst - SQL Performance Analyse mit SAP PlanViz.

SQLScript Code Analyzer

Während PlanViz für eine post factum Analyse hilfreich ist, dient SQLScript Code Analyzer dazu, Ihre SQL Funktionen und Prozeduren in Hinsicht auf mögliche Probleme in der Codequalität, Sicherheit und Performance zu untersuchen. Indem Sie einen sauberen Code sicherstellen, können Sie Performanceprobleme von vornherein verhindern.

SAP liefert dazu zwei Prozeduren aus, die den Quellcode Ihrer Funktionen und Prozeduren analysieren können: ANALYZE_SQLSCRIPT_OBJECTS sowie

ANALYZE_SQLSCRIPT_DEFINITION. Die Prozedur ANALYZE_SQLSCRIPT_OBJECTS dient dazu, bereits vorhandene Objekte zu analysieren. Alternativ kann ANALYZE_SQLSCRIPT_DEFINITION verwendet werden, um den Quellcode auf mögliche Verbesserungspotentiale zu untersuchen, bevor die Funktion bzw. Prozedur angelegt wurde.

Web Werkzeuge

Die zuvor beschriebenen Werkzeuge beziehen sich primär auf die Eclipse bzw. HANA Studio Umgebung. Allerdings können neben diesen auch web-basierte Werkzeuge zur Performance Analyse eingesetzt werden. So steht die Explain Plan Funktionalität auch im HANA Database Explorer zur Verfügung.

Darüber hinaus können Sie über den Menüeintrag Generate SQL Analyzer Plan File die plv Dateien generieren. Diese werden unter “Database Diagnostic Files” abgelegt und können mit Eclipse in der PlanViz Perspektive geöffnet werden. Alternativ können Sie auch den integrierten SQL Analyzer dafür nutzen.

Dieses Werkzeug steht sowohl im Web IDE als auch im SAP Business Application Studio zur Verfügung. SQL Analyzer ähnelt dem zuvor vorgestellten PlanViz. Neben der grafischen Ansicht können Sie in den tabellarischen Sichten nähere Details zu Operatoren, zetlicher Abfolge sowie verwendeten Tabellen und Anzahl der Tabellenzugriffe erfahren.

Performance Analyse und Optimierung - Unser Fazit

Nun haben Sie einen Überblick über die verschiedenen Möglichkeiten der SQLScript Performance Analyse gewonnen. Im nächsten Artikel, SQL Performance Analyse mit SAP PlanViz, stellen wir PlanViz im Detail vor.

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!