Florian Lucht
 - 5. August 2015

OpenSQL: Profilparameter des SELECT FOR ALL ENTRIES-Befehls

rz11

Die OpenSQL-Syntax umfasst einige Sprachelemente, welche nicht zur klassischen SQL-Syntax gehören. Diese werden von der Datenbankschnittstelle in die jeweilige native Syntax übersetzt. Hierbei wird die Art der Umwandlung von Profilparametern beeinflusst. Im Folgenden werden die Profilparameter und ihre Bedeutung bezüglich der FOR ALL ENTRIES-Anweisung (FAE) vorgestellt.

Wir übernehmen Basisaufgaben und führen SAP Basis Projekte für Sie durch
Fachbereichsleiter Tobias Harmes

Ob Sie ein Systemupgrade durchführen wollen oder einfach nur Unterstützung bei der Konfiguration Ihrer SAP Systemlandschaft benötigen, wir bieten Ihnen unsere kompetenten Berater an: SAP Basis und SAP Security Berater von RZ10 buchen.

Unsere Referenzen finden Sie hier.

Kontaktieren Sie mich: Telefon 0211.9462 8572-25 oder per E-Mail harmes@rz10.de.

In einem unverbindlichen Gespräch kann ich mit Ihnen über Ihre Ausgangslage sprechen und Ihnen Möglichkeiten aufzeigen. Selbstverständlich können wir danach auch ein unverbindliches Angebot unterbreiten.

Profilparameter mit der RZ11-Transaktion bei OpenSQL

Die vorgestellten Profilparameter können über die Transaktion RZ11 mit den Werten 0, 1 und -1 belegt werden. Bei der Angabe von -1 wird in Abhängigkeit des Datenbanksystems mit der OpenSQL-Syntax ein Default-Wert verwendet. Diese wird unter „Aktueller Wert“ angezeigt.

OpenSQL

Die Art der Umsetzung wird über die Parameter rsdb/prefer_union_all, rsdb/prefer_join und
rsdb/prefer_in_itab_opt gesteuert und lässt sich mit Hilfe des SQL-Trace (ST05) nachvollziehen.
Sind all diese Parameter mit Null gepflegt, wird die FAE-Anweisung für jede Tabellenzeile durch eine OR-Verknüpfung realisiert. Das heißt eine Abfrage der Form

SELECT ... FOR ALL ENTRIES IN lt_data WHERE val = lt_data-val.

wird in

SELECT ... WHERE val = lt_data[1]-val
OR lt_data[2]-val
OR ... 
OR t_data[n]-val.

übersetzt. Hierbei entspricht lt_data[i]-val gerade dem zugehörigen Eintrag in der i-ten Zeile.

Ist der Parameter rsdb/prefer_union_all gesetzt, ergibt sich für das native Statement folgende Ausgabe:

SELECT ... WHERE  val = lt_data[1]-val UNION ALL
SELECT ... WHERE  val = lt_data[2]-val UNION ALL
....
SELECT ... WHERE  val = lt_data[n]-val.

Der Parameter rsdb/prefer_join erzeugt eine Abfrage, welche vergleichbar einem Join mit einer internen Tabelle ist und kann ab Kernelversion 7. 00 für die Datenbankplattformen DB6 (DB2 UDB) und „MS SQL Server“ sowie ab Kernelversion 7.10 für Oracle genutzt werden. Der Parameter übersteuert hierbei rsdb/prefer_union_all.

Bei Anweisungen, welche nur eine Bedingung an die FAE-Tabelle stellen, kommt der Parameter rsdb/prefer_in_itab_opt zum Tragen. Er erzeugt ein SQL-Statement der Form

SELECT ... WHERE val IN ( lt_data[1]-val, lt_data[2]-val, ...,  lt_data[n]-val ).

und übersteuert ggf. die vorhergehenden Parameter.

Weitere Parameter

Neben den Parametern für die Beschreibung der Umsetzung stehen noch weitere Parameter zur Einschränkung der Größe der SQL-Anweisung zur Verfügung. Diese geben die maximale Anzahl der zu verarbeitenden Zeilen aus der Treibertabelle an. Überschreitet die Tabelle diese Grenze, werden entsprechend mehre SQL-Statements erzeugt und nach der Verarbeitung zusammengefasst. Dies dient zum einem der optimierten Abfrage, da zum Beispiel einige Datenbanksystem ab einer bestimmten Anzahl an OR-Verknüpfungen einen Full-Table-Scan durchführen anstatt auf einen Index zurückzugreifen. Andererseits schützt es vor einem zu großem SQL-Query-String (anhängig von der zugrundeliegenden Datenbank), welcher zu einem Laufzeitfehler (DBSQL_STMNT_TOO_LARGE) führt. Dieser tritt zum Beispiel bei der Verwendung sehr großer Range-Tabellen in der WHERE-Abfrage auf.

Die Parameter lauten rsdb/max_blocking_factor (OR, UNION, JOIN) bzw. rsdb/max_in_blocking_factor (IN). Ab Kernelversion 7.20 steht darüber hinaus noch der optionale Parameter rsdb/max_union_blocking_factor (UNION) zur Verfügung.

Parameter zur Performanceoptimierung

In Abhängigkeit von der Datenbank kann zur Performanceoptimierung noch der Parameter rsdb/prefer_fix_blocking gesetzt werden. Dieser bewirkt, dass bei der Blockbildung der SQL-Abfragen das letzte Statement mit identischen Bedingungen bis zu maximal Anzahl aufgefüllt wird. Diese werden von Datenbank selbst ignoriert, können aber im SAP-Cursor-Cache durch die einheitliche Blockgröße zu einer erhöhten Performance führen. Neben der oben erwähnten maximalen Blockgröße kann noch eine zweite alternative Blockgröße über die Parameter rsdb/min_blocking_factor, rsdb/min_in_blocking_factor und rsdb/min_union_blocking_factor (ab 7.20) gesetzt werden. Ist also das Verwenden einer festen Blockgröße eingestellt, wird die SQL-Abfrage zur maximalen oder ggf. minimalen Blockgröße aufgefüllt.

Hier noch einmal alle Profilparameter der OpenSQL-Syntax im Überblick:

rsdb/prefer_union_all Umsetzung in UNION-Statement, sonst OR
rsdb/prefer_join Umsetzung in JOIN-Statement
rsdb/prefer_in_itab_opt Umsetzung in IN-Statement (bei einer Bedingung)
rsdb/max_blocking_factor Standardblockgröße OR/UNION/JOIN
rsdb/max_in_blocking_factor Standardblockgröße IN-Statement
rsdb/max_union_blocking_factor Standardblockgröße UNION (ab 7.20)
rsdb/prefer_fix_blocking Feste Blockgröße auf letztes Statement (auffüllen)
rsdb/min_blocking_factor Alternative Blockgröße OR/UNION/JOIN
rsdb/min_in_blocking_factor Alternative Blockgröße IN
rsdb/min_union_blocking_facto Alternative Blockgröße UNION (ab 7.20)

Im Normalfall bedarf es keiner Anpassung der Parameter, da sie über die Default-Werte optimal an das jeweilige Datenbanksystem angepasst sind. Das Verständnis hilft jedoch bei der Performanceoptimierung vom Datenbankabfragen.

Ihre Erfahrung mit OpenSQL

Wie sind Ihre Erfahrungen zu dem Setzen von Datenbankspezifischen Profilparametern?

Jetzt das kostenlose E-Book zum Thema SAP Basis herunterladen:

Jetzt das kostenlose E-Book mit ausgewählten Fachartikeln herunterladen:


SHARE



Schreiben Sie einen Kommentar

Bitte füllen Sie alle mit * gekennzeichneten Felder aus. Ihre E-Mail Adresse wird nicht veröffentlicht.