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
|
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.
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";
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ü.
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.
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.
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.
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!