NextLytics Blog

Wie Sie die Performance Ihrer SQL Funktionen steigern

Geschrieben von Sebastian Uhlig | 04.05.2023 07:29:44

Während andere Werkzeuge die Performance der Ausführung prüfen, also das Ergebnis des geschriebenen Codes, dient SQLScript Code Analyzer dazu, den Code selbst zu prüfen. Dieses Werkzeug kann sowohl für bestehende Prozeduren bzw. Funktionen, als auch vor der Erstellung dieser verwendet werden. Dabei erfolgt eine Prüfung auf Qualität, Sicherheit und Performance. Die Ergebnisse der Überprüfung werden in Form einer Tabelle ausgegeben.

In diesem Artikel erklären wir zunächst die Grundlagen und zeige anschließend die Funktionsweise dieses Tools anhand von konkreten Beispielen. Die dabei bereitgestellten Code Snippets können Sie für die eigenen Implementierungen verwenden.

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 

 

Zwei Prozeduren und eine Regel-Tabelle

Für die Analyse des Codes stellt SAP zwei Prozeduren zur Verfügung ANALYZE_SQLSCRIPT_OBJECTS und ANALYZE_SQLSCRIPT_DEFINITION. Nachfolgend stellen wir jede Prozedur im Detail vor. Die Regeln sind in der Tabelle sqlscript_analyzer_rules enthalten und können über die folgende Anweisung eingesehen werden:

 SELECT * FROM sqlscript_analyzer_rules; 

Diese Tabelle ist sowohl in on-premises HANA Systemen als auch in der HANA Cloud verfügbar. Die Regeln in der Tabelle werden im Laufe der Zeit mit den herausgebrachten Service Packages erweitert. Im Moment sind folgende Regeln verfügbar:

ANALYZE_SQLSCRIPT_OBJECTS

Mithilfe der Prozedur ANALYZE_SQLSCRIPT_OBJECTS können Sie den Quellcode von bereits vorhandenen Prozeduren bzw. Funktionen analysieren. Sie können auch mehrere Prozeduren auf einmal prüfen. Dabei werden die zu prüfenden Objekte als Parameter übergeben. Insgesamt verfügt die Prozedur über vier Parameter, die wir nachfolgend erläutern:

Parameter

Beschreibung

OBJECTS

Eine Liste von SQLScript Prozeduren und Funktionen, die geprüft werden sollen.

RULES

Die bei der Prüfung verwendeten Regeln. Können der Tabelle sqlscript_analyzer_rules entnommen werden.

OBJECT_DEFINITIONS

Enthält die Namen und Definitionen aller geprüfter Objekte.

FINDINGS

Enthält potenzielle Probleme, die bei der Prüfung festgestellt wurden.

 

Anbei ein Beispiel für den Aufruf der Prozedur ANALYZE_SQLSCRIPT_OBJECTS. Dabei werden alle Prozeduren vom Typ SQLScript im Schema DRS gescannt. Es können auch mehrere Schemen gleichzeitig überprüft werden.

DO BEGIN
lt_rules =
  SELECT rule_namespace,
                   rule_name,
                   category
    FROM sqlscript_analyzer_rules;

lt_procedures =
  SELECT  schema_name,
                    procedure_name AS object_name, --object_name erwartet
                      definition

  FROM sys.procedures  
    WHERE procedure_type = 'SQLSCRIPT2' AND schema_name
IN('DRS','[SCHEMA_NAME]','[ANOTHER_SCHEMA_NAME]');

CALL analyze_sqlscript_objects( :lt_procedures,
                                :lt_rules,
                                lt_objects,
                                lt_findings);

  SELECT objects.schema_name, objects.object_name, findings.*,
objects.object_definition  

  FROM :lt_findings AS findings  

  JOIN :lt_objects AS objects  

  ON objects.object_definition_id = findings.object_definition_id;

END;

Das Ergebnis der Analyse ist in Spalten RULE_NAME und SHORT_DESCRIPTION einsehbar. Die Spalte OBJECT_DEFINITION zeigt den betroffenen Code.

Das Ganze funktioniert auch mit Funktionen. Sie müssen lediglich im Aufruf procedure mit function ersetzen:

DO BEGIN
lt_rules =
  SELECT rule_namespace,
                   rule_name,
                   category
  FROM sqlscript_analyzer_rules;

lt_functions =
  SELECT  schema_name,
                    function_name AS object_name, --object_name erwartet
                    definition
  FROM sys.functions  
    WHERE function_type = 'SQLSCRIPT2' AND schema_name
IN('DRS','[SCHEMA_NAME]','[ANOTHER_SCHEMA_NAME]');

CALL analyze_sqlscript_objects( :lt_functions,
                                                   :lt_rules,
                                                    lt_objects,
                                                      lt_findings);


SELECT objects.schema_name, objects.object_name, findings.*,
objects.object_definition  
FROM :lt_findings AS findings  
JOIN :lt_objects AS objects  
ON objects.object_definition_id = findings.object_definition_id;
END;

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

ANALYZE_SQLSCRIPT_DEFINITION

Im Gegensatz zu der vorher vorgestellten Prozedur, welche die Code Repository nach Verbesserungspotentialen scannt, kann ANALYZE_SQLSCRIPT_DEFINITION dazu verwendet werden, um den Quellcode noch nicht erstellter Prozeduren oder Funktionen zu analysieren. Es ist nützlich, den Code zu überprüfen, bevor man eine Prozedur anlegt. Dabei ist das Vorgehen ähnlich wie bei der Prozedur ANALYZE_SQLSCRIPT_OBJECTS - Sie übergeben die Regeln und den Quellcode als Parameter. Die Ergebnisse werden in Form einer Tabelle ausgegeben. Die Prozedur ANALYZE_SQLSCRIPT_DEFINITION verfügt über die folgenden Parameter:

Parameter

Beschreibung

OBJECT_DEFINITIONS

Enthält den zu prüfenden Quellcode.

RULES

Die bei der Prüfung verwendeten Regeln. Können der Tabelle sqlscript_analyzer_rules entnommen werden.

FINDINGS

Enthält potenzielle Probleme, die bei der Prüfung festgestellt wurden.

 

Der Aufruf der Prozedur kann zum Beispiel so erfolgen:

DO BEGIN
lt_rules =
SELECT rule_namespace,
rule_name,
category
FROM sqlscript_analyzer_rules;

CALL analyze_sqlscript_definition(
'
CREATE PROCEDURE concatenate_name(
IN lv_firstname NVARCHAR(30),
IN lv_lastname NVARCHAR(30),
OUT lv_name NVARCHAR(62)
)
AS BEGIN
DECLARE lv_output NVARCHAR(62) default '' '';
lv_name = lv_firstname || '' '' || lv_lastname;
END;
',
:lt_rules,
lt_findings);
SELECT * FROM :lt_findings;
END;

Die Ergebnisse werden genauso wie bei  ANALYZE_SQLSCRIPT_OBJECTS in einer Tabelle dargestellt.

Das Ganze funktioniert auch analog mit der CREATE FUNCTION Anweisung:

DO BEGIN
lt_rules =
SELECT rule_namespace,
rule_name,
category
FROM sqlscript_analyzer_rules;

CALL analyze_sqlscript_definition(
'
CREATE FUNCTION udf_concatenate_name(
lv_firstname NVARCHAR(30),
lv_lastname NVARCHAR(30)
)
RETURNS lv_name NVARCHAR(62)
AS BEGIN
lv_name = lv_firstname || '' '' || lv_lastname;
END;
',
:lt_rules,
lt_findings);
SELECT * FROM :lt_findings;
END;

SQL Funktionen - Unser Fazit

In diesem Artikel haben Sie zwei hilfreiche Prozeduren zur Steigerung von SQLScript Performance kennengelernt. Zum einen können Sie bereits vorhandene Prozeduren und Funktionen scannen und nachbessern. Zum anderen können Sie Ihren Quellcode bereits in der Spezifikationsphase prüfen und so mögliche Performance Probleme von vornherein verhindern.

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!