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
|
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:
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;
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;
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!