WebSphere Message Broker Version 8.0.0.5 Betriebssysteme: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Sehen Sie sich die Informationen zur aktuellen Produktversion im IBM Integration Bus Version 9.0 an.

Tipps für ESQL-Code

Es gibt einige Möglichkeiten, die Leistung von Nachrichtenflüssen zu optimieren, in denen ESQL-Code verwendet wird.

Bevor Sie beginnen:

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:

ESQL-Arrayverarbeitung

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.

ESQL-Funktion CARDINALITY

Vermeiden Sie die Verwendung der Funktion CARDINALITY in Schleifen; Beispiel:
WHILE ( I < CARDINALITY (InputRoot.MRM.A.B.C[]
Die Funktion CARDINALITY muss bei jedem Durchlaufen der Schleife ausgewertet werden, was sich nachteilig auf die Leistung auswirkt. Dies gilt vor allem für große Arrays, da die Schleife hier öfter wiederholt wird. Es ist sinnvoller, vor der WHILE-Schleife die Größe des Arrays zu ermitteln (sofern diese sich nicht innerhalb der Schleife ändert), sodass die Funktion nur einmal ausgewertet wird; Beispiel:
SET ARRAY_SIZE = CARDINALITY (InputRoot.MRM.A.B.C[]
WHILE ( I < ARRAY_SIZE )

ESQL-Anweisungen DECLARE und EVAL

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.

ESQL-Anweisung PASSTHRU

Bei Verwendung von PASSTHRU-Anweisungen kann die Leistung wie folgt erheblich verbessert werden:

  • Vermeiden Sie beim Aufruf einer gespeicherten Prozedur die Verwendung einer CALL-Anweisung zusammen mit der PASSTHRU-Anweisung. Stattdessen können Sie die Befehle CREATE PROCEDURE ... EXTERNAL ... und CALL ... verwenden.
  • Verwenden Sie bei SQL-Anweisungen, für die Literal- oder Datenwerte erforderlich sind, Hostvariablen, die einer Variablen einen Spaltenwert zuordnen. Dadurch können dynamische SQL-Anweisungen in der Datenbank wiederverwendet werden. Die Verwendung von SQL PREPARE in einer dynamischen Anweisung wirkt sich nachteilig auf die Leistung aus; daher ist es sinnvoller, die PREPARE-Anweisung nur einmal und anschließend mehrmals die EXECUTE-Anweisung auszuführen, als jedesmal die PREPARE- und die EXECUTE-Anweisung auszuführen.

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.

Bei Verwendung der folgenden Anweisung hingegen ist auch bei Änderungen am Preis oder am Unternehmen keine andere Anweisung oder PREPARE-Anweisung erforderlich:
PASSTHRU(’UPDATE SHAREPRICES AS SP SET Price = ? WHERE SP.COMPANY = ?’,
InputRoot.XML.Message.Price,InputRoot.XML.Message.Company);
Sie können überprüfen, ob der dynamische SQL-Code eine maximale Wiederverwendung von Anweisungen erreicht, indem Sie mithilfe der folgenden Befehle den SQL-Anweisungscache in DB2 anzeigen:
db2 connect to <Datenbankname>
db2 get snapshot for database on <Datenbankname>
Mit den folgenden Befehlen können Sie den Inhalt des Cache für dynamische Anweisungen anzeigen:
db2 connect to <Datenbankname>
db2 get snapshot for dynamic SQL on <Datenbankname>

ESQL-Referenzvariablen

Mithilfe von Referenzvariablen können Sie auf lange Korrelationsnamen wie InputRoot.XMLNSC.A.B.C.D.E verweisen. Dazu müssen Sie wie folgt einen Referenzzeiger deklarieren:
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.

ESQL-Zeichenfolgefunktionen

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.

Nachrichtenbaumstrukturen mit sich wiederholenden Datensätzen

Die Leistung kann in den folgenden Fällen beeinträchtigt werden:

  • Umfangreiche Nachrichtenbaumstrukturen werden mithilfe von ESQL-Verarbeitung manipuliert.
  • Die Nachrichtenbaumstruktur besteht aus sich wiederholenden Datensätzen oder vielen Feldern.
  • Mit expliziten SET-Anweisungen wurden Feldreferenzpfade erstellt, um auf Felder zuzugreifen oder Felder zu erstellen.
  • Es kommt zu einer Verlangsamung bei der Nachrichtenflussverarbeitung, wenn von ESQL mehr Felder oder Wiederholungen verarbeitet 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:

  • Für den Zugriff auf Feld 1 navigiert die SET-Anweisung zu 'ParentA' und anschließend zum ersten Feld, d. h., es sind zwei Navigationsvorgänge erforderlich.
  • Für den Zugriff auf Feld 5 navigiert die SET-Anweisung zu 'ParentA'; anschließend durchläuft sie alle vorherigen Felder, bis sie schließlich Feld 5 erreicht, d. h., es sind sechs Navigationsvorgänge erforderlich.

Das Navigieren zu allen Feldern, die dem angegebenen Feld vorausgehen, führt letztlich zum Leistungsverlust.

Das folgende Beispiel zeigt, wie auf sich wiederholende Felder in einer Eingabenachrichtenstruktur zugegriffen wird:
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.
  • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[1]' erfolgt ein Navigationsvorgang, um zum ersten Datensatz zu gelangen.
  • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[2]' erfolgen zwei Navigationsvorgänge, um zum zweiten Datensatz zu gelangen.
  • Beim Zugriff auf 'InputRoot.MRM.myParent.myRepeatingRecord[N]' erfolgen n Navigationsvorgänge, um zum n-ten Datensatz zu gelangen.

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.

Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Letzte Aktualisierung:
        
        Letzte Aktualisierung: 2015-02-28 16:23:05


TaskthemaTaskthema | Version 8.0.0.5 | bj28653_