Zugriffsoptimierung in Queries 
Durch einige Erweiterungen, die im OPEN SQL vorgenommen wurden, kann eine deutliche Verbesserung der Performance von ABAP-Reports erzielt werden. Diese Erweiterungen werden von der SAP Query ausgenutzt, um die Laufzeit von Query-Reports zu verbessern.
Die Erweiterungen bestehen darin, daß es bei allen SELECT-Anweisungen möglich ist, eine Liste der Felder anzugeben, die tatsächlich aus der Datenbanktabelle gelesen werden sollen. Bei der Verwendung von ‘*’ als Feldliste werden immer alle Felder gelesen. Da die Übertragung der Felder aus der Datenbank in die entsprechenden Programmfelder häufig mit Konvertierungen verbunden ist, ist dieses Verfahren uneffektiv, wenn eine Datenbanktabelle sehr viele Felder enthält und nur einige wenige dieser Felder in einem Programm wirklich benötigt werden. Dieser Fall trifft in der Regel für Query-Reports zu.
Im Zusammenhang mit den Feldlisten in SELECT-Anweisungen wurde auch die GET-Anweisung erweitert. Auch hier ist es möglich, eine Liste der Felder anzugeben, die in einem Report wirklich benötigt werden. Nur diese Felder werden aus der logischen Datenbank gelesen. Der Zusammenhang zwischen der GET- und der SELECT-Anweisung besteht darin, daß in dem betreffenden Datenbankprogramm die GET-Anweisung letztlich mit Hilfe einer SELECT-Anweisung realisiert wird. Die Angabe von Feldlisten in einer GET-Anweisung ist allerdings nur möglich, wenn die betreffende logische Datenbank dies unterstützt.
Die von der Query unterstützte Ausnutzung der Feldlisten in SELECT- und GET-Anweisungen wird unter dem Begriff ‘Zugriffsoptimierung’ zusammengefaßt. Dabei wird wie folgt verfahren:
Bei der Generierung eines InfoSets wird eine Liste aller Felder erstellt, die bei Benutzung des InfoSets in einer Query benötigt werden (Referenzliste). Wesentlich sind dabei Zusatztabellen und Coding-Teile (Zusatzfelder, Codings zu den Zeitpunkten GET, GET LATE und Satzverarbeitung), da hier auf andere Felder zugegriffen wird. Die Referenzliste sichert, daß der Reportgenerator der Query aus den in der Liste direkt benötigten Feldern alle Felder bestimmen kann, die implizit durch Verwendung einer Zusatztabelle oder eines Codings benötigt werden. Mit diesen Informationen ist der Reportgenerator dann in der Lage, bei allen zu generierenden SELECT- und GET-Anweisungen Feldlisten anzugeben.
Solange ein InfoSet keine Zusatzfelder und keine Coding-Teile enthält, kann die Referenzliste vollständig und damit fehlerfrei bei der Generierung erstellt werden. Probleme können bei der Verwendung von ABAP-Code entstehen. Es ist dann möglich, daß das InfoSet nicht alle Informationen enthält, um die benötigten Felder zu ermitteln, so daß die Referenzliste unvollständig wird. Dies kann in Query-Reports dazu führen, daß benötigte Felder bei der Abarbeitung des Reports immer nur ihren Initialwert enthalten.
Wenn ein InfoSet Coding-Teile enthält, die zu Problemen führen können, wird bei jeder Generierung eine Warnung ausgegeben. Dann sollte überprüft werden, ob einer der unten beschriebenen Fälle zutrifft und das InfoSet entsprechend korrigiert werden.
Zur Erzeugung der Referenzliste muß ermittelt werden, welche Felder zur Generierung von Query-Reports benötigt werden. Das können folgende Felder sein:
Innerhalb von Coding-Teilen ist es wegen der freien Verwendbarkeit von ABAP-Sprachelementen möglich, auf Felder zuzugreifen, ohne diese Felder explizit aufzuführen (Feldsymbole, externer Perform, DO... VARYING, ADD... THEN... UNTIL, usw.). Um eine fehlerfreie Generierung von Query-Reports zu gewährleisten, muß jedoch aus JEDEM (!) Coding-Stück (Zusatzfeld, GET / GET LATE / Satzverarbeitung) ermittelt werden können, auf welche Felder zugegriffen wird. Dazu ist es notwendig, daß jedes verwendete Feld in diesem Coding-Stück auch benannt wird. Wenn eines der Coding-Stücke ABAP-Anweisungen enthält, die implizit auf Felder zugreifen, so muß mit Hilfe der ABAP-Anweisung FIELDS innerhalb des Coding-Stückes sichergestellt werden, daß alle verwendeten Datenbank-, Tabellen- und Zusatzfelder auch explizit genannt werden.

Die Tabelle KNC1 enthalte die Felder UM01U, UM02U und UM03U mit den Monatsumsätzen der ersten drei Monate eines Jahres. Ein Zusatzfeld Q1, das den Umsatz des ersten Quartals enthalten soll, berechnet die Summe dieser drei Felder mit Hilfe eines externen Performs.
PERFORM QUARTAL1(pppppppp) USING Q1.
Der Zugriff auf die Felder KNC1-UM01U, KNC1-UM02U und KNC1-UM03U erfolgt über den gemeinsamen Speicherbereich für die Tabelle KNC1 im Query-Report und im gerufenen Programm pppppppp. Dem oben angegebenen Coding ist nicht zu entnehmen, daß die genannten Felder benötigt werden. Deshalb muß dieses Coding-Stück wie folgt geändert werden:
PERFORM QUARTAL1(pppppppp) USING Q1.
FIELDS: KNC1-UM01U, KNC1-UM02U, KNC1-UM03U.
Bitte beachten Sie, daß für jedes Coding-Stück alle verwendeten Felder benannt sein müssen, da ein Coding-Stück nur bei Bedarf in den Query-Report übernommen wird, und somit für jedes Coding-Stück gesondert ermittelt werden muß, welche Felder benötigt werden.
Bitte beachten Sie weiterhin, daß in einem Coding nur die unmittelbar verwendeten Felder benannt werden müssen.

Die Zusatzfelder F1 und F2 sind mit folgenden Codings definiert:
F1: F1 = TAB-FELD. "TAB-FELD ist ein Datenbankfeld
F2: F2 = F1 + 2.
Obwohl F2 indirekt auf TAB-FELD zugreift, ist es nicht notwendig, TAB-FELD im Coding von F2 als verwendetes Feld aufzuführen. Die Auflösung solcher indirekten Referenzen wird bei der Generierung des InfoSets automatisch vorgenommen. Die Codings für beide Zusatzfelder sind in der vorliegenden Form also korrekt.
In Ausnahmefällen kann in einem Coding die Anweisung
FIELDS TAB.
verwendet werden, wobei TAB eine Datenbanktabelle oder eine Zusatztabelle ist. Dies bewirkt, daß alle Felder der Tabelle TAB im Query-Report bereitgestellt werden. Dabei ist jedoch zu beachten, daß in diesem Fall der optimierte Zugriff auf die Tabelle TAB ausgeschaltet wird und damit ein deutlicher Performance-Verlust bei der Abarbeitung von Queries zu erwarten ist.
Wenn die genannten Hinweise bei der Pflege eines InfoSets beachtet werden, kann die Referenzliste immer vollständig erzeugt werden. Da die Generierung jedoch diesen Sachverhalt nicht überprüfen kann, kann auch der Fall, daß eine unvollständige Referenzliste beim Generieren erzeugt wird, nicht ausgeschlossen werden. Eine unvollständige Referenzliste bedeutet für Query-Reports, daß u.U. benötigte Felder nicht aus der Datenbank gelesen werden und immer ihren Initialwert besitzen. Es existiert deshalb eine spezielle Testmöglichkeit für Queries.
Wenn eine Query fehlerhafte Ergebnisse liefert und die Ursache in einer unvollständigen Referenzliste vermutet wird, kann ein Query-Report auch ohne Zugriffsoptimierung generiert werden. Dazu muß auf dem Bild Titel, Format der Komponente zur Pflege von Queries die Funktion Zusätze
® Optimierung ein/aus aufgerufen werden. Nach dem erstmaligen Aufruf dieser Funktion erscheint ein gesetztes Ankreuzfeld auf dem Bild, das besagt, daß für diese Query keine Zugriffsoptimierung vorzusehen ist. Es werden dann stets alle Felder aller benötigten Tabellen gelesen. Das Wiedereinschalten der Zugriffsoptimierung erfolgt durch erneutes Aufrufen der Funktion Zusätze ® Optimierung ein/aus oder durch Entmarkieren des Ankreuzfeldes.Die Zugriffsoptimierung sollte nur zum Testen ausgeschaltet werden. Arbeitet die Query mit ausgeschalteter Zugriffsoptimierung korrekt, so muß das InfoSet so überarbeitet werden, daß eine vollständige Referenzliste generiert wird (siehe oben). Anderenfalls hat der Fehler eine andere Ursache.
Nach einem Test ohne Zugriffsoptimierung und der ggf. notwendigen Überarbeitung des InfoSets sollte die Zugriffsoptimierung immer wieder eingeschaltet werden. Anderenfalls ist mit erheblichen Performance-Verlusten zu rechnen.