Es gibt einige Möglichkeiten, die Leistung von Nachrichtenflüssen zu optimieren, in denen ESQL-Code verwendet wird.
Bei der Erstellung von ESQL-Code gibt es verschiedene Möglichkeiten, die Leistung Ihrer Nachrichtenflüsse zu verbessern. Hinweise hierzu finden Sie in den folgenden Abschnitten:
Leistungstechnisch gesehen sind Array-Subscripts [ ] aufgrund der Art und Weise, wie sie zur Ausführungszeit dynamisch ausgewertet werden, aufwendig. Sie können die Leistung Ihres ESQL-Codes verbessern, indem Sie die Verwendung von Array-Subscripts nach Möglichkeit vermeiden. Stattdessen können Sie Referenzvariablen verwenden, die einen Verweis auf das Array enthalten und wiederverwendet werden können; Beispiel:
DECLARE myref REFERENCE TO InputRoot.XML.Invoice.Purchases.Item[1];
-- Jedes Element im Bereich verarbeiten
WHILE LASTMOVE(myref)=TRUE DO
-- Zu jedem Element im Bereich 1 hinzufügen
SET myref = myref + 1;
-- Verarbeiten
-- Dynamischen Verweis auf nächstes Element im Bereich setzen
MOVE myref NEXTSIBLING;
END WHILE;
Beispiel für ESQL-Arrayverarbeitung:
Das folgende Beispiel zeigt, wie mithilfe von ESQL Datensätze aus einer Datenbank gelesen werden. Durch die wiederholte Verwendung von Array-Subscripts wie beispielsweise Environment.Variables.DBData[A] wird die Verarbeitungszeit erheblich erhöht:
SET Environment.Variables.DBDATA[] =
(
SELECT T.*
FROM Database.{'ABC'}.{'XYZ'} as T
);
DECLARE A INTEGER 1;
DECLARE B INTEGER CARDINALITY(Environment.Variables.*[]);
SET JPcntFODS = B;
WHILE A <= B DO
CALL CopyMessageHeaders();
CREATE FIELD OutputRoot.XML.FODS;
DECLARE outRootRef REFERENCE TO OutputRoot.XML.Data;
SET outRootRef.Field1 = Trim(Environment.Variables.DBDATA[A].Field1);
SET outRootRef.Field2 = Trim(Environment.Variables.DBDATA[A].Field2);
SET outRootRef.Field3 = Trim(Environment.Variables.DBDATA[A].Field3);
SET outRootRef.Field4 = Trim(Environment.Variables.DBDATA[A].Field4);
SET outRootRef.Field5 = Trim(Environment.Variables.DBDATA[A].Field5);
. . .
. . .
SET outRootRef.Field37 = CAST(Environment.Variables.DBDATA[A].Field37)
SET A = A + 1;
PROPAGATE;
END WHILE;
Mithilfe von Referenzvariablen können Sie die Verarbeitungszeit erheblich verkürzen.
WHILE ( I < CARDINALITY (InputRoot.MRM.A.B.C[]
SET ARRAY_SIZE = CARDINALITY (InputRoot.MRM.A.B.C[]
WHILE ( I < ARRAY_SIZE )
Sie können die Leistung durch Verringern der Anzahl an DECLARE-Anweisungen verbessern, indem Sie in einer einzigen Anweisung eine Variable deklarieren und ihren Ausgangswert setzen. Ebenso können Sie mehrere Variablen desselben Datentyps in einer einzigen ESQL-Anweisung anstatt in mehreren ESQL-Anweisungen deklarieren. Damit wird auch die Speicherbelegung reduziert.
Die EVAL-Anweisung wird hin und wieder verwendet, wenn Korrelationsnamen dynamisch ermittelt werden müssen. Dies führt jedoch zu einer hohen CPU-Auslastung, da die Anweisung zweimal ausgeführt werden muss: Bei der ersten Ausführung werden die einzelnen Komponenten ermittelt, um die Anweisung zu erstellen, die ausgeführt werden soll; anschließend wird diese Anweisung ausgeführt.
Bei Verwendung von PASSTHRU-Anweisungen kann die Leistung wie folgt erheblich verbessert werden:
Die folgende Anweisung hat beispielsweise einen Daten- und einen Literalwert: 100 und IBM:
PASSTHRU(’UPDATE SHAREPRICES AS SP SET Price = 100 WHERE SP.COMPANY = ‘IBM’’);
Diese Anweisung ist effektiv, wenn der Preis 100 beträgt und es sich bei dem Unternehmen um IBM handelt. Wenn sich der Preis oder das Unternehmen ändert, ist eine andere Anweisung mit einer anderen SQL PREPARE-Anweisung erforderlich, was sich nachteilig auf die Leistung auswirkt.
PASSTHRU(’UPDATE SHAREPRICES AS SP SET Price = ? WHERE SP.COMPANY = ?’,
InputRoot.XML.Message.Price,InputRoot.XML.Message.Company);
db2 connect to <Datenbankname>
db2 get snapshot for database on <Datenbankname>
db2 connect to <Datenbankname>
db2 get snapshot for dynamic SQL on <Datenbankname>
DECLARE refPtr REFERENCE to InputRoot.XMLNSC.A.B.C.D;
Auf das Element "E" der Nachrichtenbaumstruktur wird mit dem Korrelationsnamen refPtr.E. zugegriffen.
Mit REFERENCE- und MOVE-Anweisungen können Sie die Navigation innerhalb der Nachrichtenbaumstruktur vereinfachen und damit die Leistung verbessern. Dies ist hilfreich, wenn Sie eine Vielzahl an SET- oder CREATE-Anweisungen erstellen; anstatt zu dem Zweig in der Struktur zu navigieren, können Sie mithilfe einer Referenzvariablen einen Zeiger auf diesen Zweig erstellen und anschließend mit der MOVE-Anweisung die Felder nacheinander verarbeiten.
In ESQL verwendete Funktionen zur Manipulation von Zeichenfolgen können zu einer hohen CPU-Auslastung führen; mit Funktionen wie LENGTH, SUBSTRING und RTRIM wird auf einzelne Bytes in der Nachrichtenbaumstruktur zugegriffen. Diese Funktionen wirken sich erheblich auf die Leistung aus; daher kann Leistung verbessert werden, wenn sie so wenig wie möglich verwendet werden. Nach Möglichkeit sollten Sie auch die wiederholte Ausführung ein und derselben Verkettung vermeiden, indem Sie die Zwischenergebnisse in Variablen speichern.
Die Leistung kann in den folgenden Fällen beeinträchtigt werden:
Dieses Problem tritt auf, wenn Sie mithilfe von Feldreferenzen und nicht mittels Referenzvariablen auf aufeinanderfolgende Felder oder Datensätze zugreifen.
Das folgende Beispiel zeigt, wie die Nachrichtenbaumstruktur mit unabhängigen SET-Anweisungen unter Verwendung von Feldreferenzpfaden manipuliert wird. Die SET-Anweisung umfasst einen Quellen- und Zielparameter, wenn einer der Parameter oder beide Feldverweise sind:
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field = '1';
Das folgende Beispiel zeigt, wie die Leistung beeinträchtigt wird, wenn mit der SET-Anweisung eine Vielzahl weiterer Felder erstellt wird:
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field1 = '1';
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field2 = '2';
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field3 = '3';
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field4 = '4';
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field5 = '5';
In diesem Beispiel sind alle fünf erstellten Felder 'ParentA' untergeordnet. Bevor das angegebene Feld erstellt oder geändert werden kann, muss der Broker die benannte Nachrichtenbaumstruktur durchsuchen, um dort den Punkt zu finden, der geändert werden muss. Beispiel:
Das Navigieren zu allen Feldern, die dem angegebenen Feld vorausgehen, führt letztlich zum Leistungsverlust.
DECLARE myChar CHAR;
DECLARE thisRecord INT 0;
WHILE thisRecord < 10000 DO
SET thisRecord = thisRecord + 1;
SET myChar = InputRoot.MRM.myParent.myRepeatingRecord[thisRecord];
END WHILE;
Bei Verwendung der Indexschreibweise müssen, wenn der Zähler erhöht wird, bei der Verarbeitung alle vorherigen Felder durchlaufen werden, um zu dem jeweiligen Feld zu gelangen; d. h., es müssen alle vorherigen Datensätze abgezählt werden, um zu dem Datensatz zu gelangen, auf den mit der aktuellen indexierten Referenz verwiesen wird. Aus diesem Grund beträgt die Gesamtzahl an Navigationen für diese WHILE-Schleife: 1 + 2 + 3 + .... + N (nicht linear).
Wenn Sie auf aufeinanderfolgende Felder oder Datensätze zugreifen bzw. aufeinanderfolgende Felder oder Datensätze erstellen, können Sie dieses Problem durch Verwendung von Referenzvariablen vermeiden.
Wenn Sie Sie Referenzvariablen verwenden, navigiert die Anweisung zum übergeordneten Hauptelement, das einen Zeiger zum Feld in der Nachrichtenbaumstruktur verwaltet. Im folgenden Beispiel wird das ESQL gezeigt, mit dem die Anzahl an Navigationsschritten beim Erstellen neuer Ausgabenachricht-Baumstrukturfelder reduziert wird:
SET OutputRoot.XMLNS.TestCase.StructureA.ParentA.field1 = '1';
DECLARE outRef REFERENCE TO OutputRoot.XMLNS.TestCase.StructureA.ParentA;
SET outRef.field2 = '2';
SET outRef.field3 = '3';
SET outRef.field4 = '4';
SET outRef.field5 = '5';
Mit dem folgenden ESQL-Code können Sie auf sich wiederholende Felder in einer Eingabenachrichtenstruktur verweisen:
DECLARE myChar CHAR;
DECLARE inputRef REFERENCE TO InputRoot.MRM.myParent.myRepeatingRecord[1];
WHILE LASTMOVE(inputRef) DO
SET myChar = inputRef;
MOVE inputRef NEXTSIBLING NAME 'myRepeatingRecord';
END WHILE;
Weitere Informationen hierzu finden Sie unter Dynamische Feldverweise erstellen.