Wer die Wahl hat…

Feature | 17. Mai 2005 von admin 0

Im Jahr 2001 programmierten mehr als eine Million Entwickler weltweit in ABAP – oder ABAP Objects, wie die Sprache nach den objektorientierten Erweiterungen unter dem SAP Web Application Server nun heißt – eine Zahl, die bis heute kontinuierlich weiter steigt. ABAP Objects ist seit dem Release 6.40 des SAP Web Application Servers Bestandteil der Anwendungs- und Integrationsplattform SAP NetWeaver. ABAP bleibt damit neben Java die wichtigste Programmiersprache für SAP-Entwickler.
Viele dieser Entwickler stehen bei ihrer täglichen Programmierarbeit immer wieder vor der Aufgabe, Daten aus Datenbanktabellen zu selektieren, diese dann beispielsweise durch weitere Daten anzureichen, gegebenenfalls Berechnungen vorzunehmen, die Daten aufzuarbeiten und auf der Benutzeroberfläche darzustellen. Um derartige Aufgaben zu unterstützen wurde in ABAP das Sprachkonstrukt der internen Tabellen geschaffen, der sich in drei Typen teilt:

  • Standardtabellen
  • Sortierte Tabellen
  • Hashtabellen

Am ehesten lässt sich dieses Konstrukt mit assoziativen, dynamischen Arrays in anderen Programmiersprachen wie PHP oder Perl vergleichen. Internen Tabellen dienen dazu Daten zu halten, die beispielsweise von einer oder mehreren Datenbanktabellen selektiert wurden. Große Datenmengen lassen sich auf diese Weise zeilenweise und strukturiert im Arbeitsspeicher ablegen und bearbeiten. Die einzelnen Komponenten einer Zeile entsprechen den Spalten oder Feldern der internen Tabelle. Die Daten können gezielt über Indexoperation oder Schlüsseloperationen selektiert und mit Feldnamen angesprochen werden.
Interne Tabellen finden sich in nahezu jedem ABAP-Programm – nicht nur als Hilfsmittel bei der Verarbeitung großer Datenmengen, sondern auch beim Aufbau komplexer Strukturen. Darüber hinaus nehmen Sie dem Programmierer Aufgaben wie etwa die dynmische Speicherverwaltung ab. Mit einiger Berechtigung dürfen die internen Tabellen daher als eines der zentralen Sprachkonstrukte von ABAP bezeichnet werden. Mehr als 30 Jahre hat ABAP, die Programmiersprache der SAP, nun auf dem Buckel. Doch wie die Sprache selbst haben Diskussionen über die Verwendung des “richtigen” Tabellentyps keineswegs an Aktualität verloren, wie etwa die Beiträge auf der Plattform ABAPforum zeigen.
Welcher Tabellentyp eignet sich denn nun aber für welche Aufgabenstellung am Besten? Gibt es einen Tabellentyp für alle Fälle? Diese Frage lässt sich natürlich nicht allgemeingültig beantworten. Zu viele Faktoren, beispielsweise die Datenmenge, die Schlüsselfelder oder notwendige Operationen auf der Tabelle wie Lesen und Sortieren, spielen mit in die Antwort hinein. Doch oftmals helfen auch Hinweise ohne Anspruch auf Vollständigkeit weiter.

Standardtabellen

Standardtabellen bieten Möglichkeiten, die andere in ABAP implementierte Tabellentypen nicht besitzen, beispielsweise den Zugriff via Remote Function Call (RFC). Intern wird bei Standardtabellen ein logischer Index aufgebaut, die Einträge befinden sich daher intern in einer logischen Reihenfolge. Der Zugriff auf einzelne Tabellenzeilen erfolgt entweder über den Index oder den Schlüssel. Der Schlüssel einer Standard-Tabelle ist ausnahmslos nichteindeutig. Standardtabellen zeichnen sich durch ein hohes Maß an Flexibilität aus, sicherlich der Grund dafür, warum sie in ABAP-Programmen der am häufigsten verwendete Tabellentyp sind.
Will ein Anwender beispielsweise mit verschiedenen Schlüsseln suchen – beispielsweise zuerst nach der Belegnummer, später im Programm dann auch nach der Refernzbelegnummer – bieten sich Standardtabellen an. Allerdings bieten Standardtabellen einen nur ineffizienten Lesezugriff, da die gesamte Tabelle sequentiell durchsucht wird. Die Antwortzeit steigt daher linear mit der Anzahl der Tabelleneinträge. Wer beim Lesezugriff oder bei der Suche mit einem Schlüssel eine bessere Effizienz erreichen will, muss die Tabelle gemäß dem Schlüssel sortieren und mit dem Zusatz ‚BINARY SEARCH’ (READ) zugreifen. Die Tabelle wird dann entsprechend dem Suchalgorithmus der Binärsuche nach dem betreffenden Eintrag durchsucht.

Sortierte Tabellen

In sortierten Tabellen lassen sich keine Duplikate, also doppelte Einträge mit quasi gleichem Schlüssel, speichern. Jeder Eintrag in einer sortierten Tabelle muss einen eindeutigen Schlüssel haben, bestehend aus einem oder mehreren Feldern, einer Belegnummer, einer Kreditorennummer oder ähnlichem. Dieser Tabellentyp bietet einen effizienten Lesezugriff, der nur in geringem Maße von der Größe der Tabelle abhängt, da sich bei sortierten Tabellen die Binärsuche durchführen lässt. Einfügeoperationen (Insert) in sortierte Tabellen sind etwas langsamer, da die Sortierreihenfolge beibehalten werden muss.
Sortierte Tabellen bieten eine Optimierung bei geschachtelten Abfrageschleifen:
LOOP AT TAB1
LOOP AT TAB2 WHERE KEY = TAB1-KEY
* do something
ENDLOOP
ENDLOOP
In diesem Beispiel handelt es sich um zwei sortierte Tabellen, bei der geschachtelten Abfrage werden nicht alle Tabelleneinträge in der zweiten Tabelle durchgegangen. Die Abfrage selektiert nur über diejenigen Werte, auf die die Schlüsselbedingung zutrifft. So enthält Tabelle 1 beispielsweise eine Liste von Lieferanten. Tabelle 2 enthält eine Liste von Belegen, Rechnungen etwa, die zu diesen Lieferanten gehören. Der Schlüssel der ersten Tabelle sei die Lieferantennummer, in Tabelle 2 die Beleg- und Lieferantennummer. In diesem Fall ist die Lieferantennummer für die Tabelle 2 ein Teilschlüssel, die Schleife durch Tabelle 2 endet, wenn der Schlüssel nicht mehr übereinstimmt, wenn also Belege eines anderen Lieferanten auftauchen.
Zum Vergleich: Bei Standardtabellen müssen auch immer alle Einträge der Tabelle 2 durchlaufen werden. Hier wäre es notwendig, über eine Abbruchbedingung in der Abfrageschleife eine Optimierung zu implementieren, da ansonsten alle Einträge durchlaufen würden. Ist beispielsweise von zwei Tabellen mit einmal 100 und einmal 1.000 Einträgen die Rede, wären das bei Verwendung einer Standardtabelle 100.000 Schleifendurchläufe. Diese Zahl lässt sich mit sortierten Tabellen je nach Schlüsselbedingung drastisch verringern.

Hashtabellen

Hashtabellen bieten im Allgemeinen die beste Performance beim Zugriff. Sie sollten daher insbesondere beim Zugriff auf große Datenmengen verwendet werden. Die Anzahl der Einträge spielt keine Rolle, da der Zugriff nur über den Schlüssel, einen eindeutigen Schlüssel, beispielsweise bestehend aus Beleg- und Partnernummer, möglich ist. Der Zugriff erfolgt über einen Hash-Algorithmus. Diese Algorithmen liefern in der Regel aus Eingabewerten beliebiger Länge einen eindeutigen Ausgabewert fester Länge, was einen konstanten “Aufwand” bezüglich des Zugriffs gewährleistet.
Die Einschränkung: Der Zugriff ist nur dann effizient, wenn der volle Tabellenschlüssel spezifiziert wird, ansonsten ist die Performance wie bei Standardtabellen linear von der Größe der Tabelle abhängig. Einträge in Hashtabellen besitzen eine Reihenfolge und lassen sich sortieren. Hashtabellen bieten sich immer dann an, wenn Daten vorliegen, die eindeutige Schlüssel besitzen und sichergestellt ist, dass die Eindeutigkeit gewahrt bleibt. Damit lassen sich sehr gut Pendants zu Datenbanktabellen in einem Programm abbilden.
Fazit: Wer stur einem “Automatismus” folgend einfach immer den Tabellentyp “Standard” verwendet, wird mit seinen Programmen unter Umständen rasch an Performancegrenzen stoßen. Um keine Performance zu verschenken, gilt es im Einzelfall sorgfältig zu prüfen, welcher Tabellentyp für eine Aufgabenstellung der Sinnvollste ist.

Tanja Russow

Leave a Reply