Show TOC Anfang des Inhaltsbereichs

Operationen mit einzelnen Zeilen  Dokument im Navigationsbaum lokalisieren

Einfluss der Tabellenart

Beim Zugriff auf einzelne Zeilen müssen wir zwischen Operationen unterscheiden, die für alle Tabellenarten möglich sind und solchen, die nur mit Index-Tabellen möglich sind. Bei den Index-Tabellen (Standard- und sortierte Tabellen) wird ein interner Index verwaltet, so dass Indexzugriffe möglich sind. Hash-Tabellen haben keinen linearen Index, so dass nur Schlüsselzugriffe möglich sind. Die Operationen, die für alle Tabellenarten möglich sind, führen keine Indexzugriffe durch. Sie können beispielsweise auch in Prozeduren oder mit Feldsymbolen ausgeführt werden, deren Tabellenart nicht durch eine Typisierung festgelegt ist. Wir bezeichnen solche Operationen deshalb auch als generische Operationen.

Die Anweisungen zum Zugriff auf Zeilen beliebiger Tabellenarten unterscheiden sich von den Anweisungen zum Zugriff auf Index-Tabellen bis auf wenige Ausnahmen durch den Zusatz TABLE hinter dem entsprechenden Schlüsselwort. Beispielsweise werden mit MODIFY TABLE die Zeilen beliebiger Tabellen geändert und mit MODIFY nur die Zeilen von Index-Tabellen.

Indexzugriffe und Schlüsselzugriffe

Der Schlüsselzugriff adressiert Zeilen über den Tabellenschlüssel und ist für alle Tabellenarten möglich. Der Indexzugriff adressiert Zeilen über den internen Index und ist daher nur bei Standardtabellen und sortierten Tabellen möglich. Nach einem Zugriff auf eine Indextabelle ist das Systemfeld sy-tabix immer mit dem Index der angesprochenen Zeile gefüllt. Bei allen erfolgreichen Zugriffen auf Zeilen interner Tabellen wird das Systemfeld sy-subrc mit dem Wert null, ansonsten mit einem Wert ungleich null gefüllt. Die folgende Tabelle fasst die Zugriffsmöglichkeiten auf die einzelnen Tabellenarten nochmals zusammen.

 

 

Standardtabelle

Sortierte Tabelle

Hash-Tabelle

Indexzugriff

ja

ja

Nein

Schlüsselzugriff

ja

ja

Ja

Schlüsselwerte

nicht eindeutig

eindeutig oder
nicht eindeutig

Eindeutig

bevorzugter Zugriff

vorwiegend
Index

vorwiegend Schlüssel

ausschließlich Schlüssel

 

In der letzten Zeile der Tabelle wird eine bevorzugte Zugriffsart für die verschiedenen Tabellenarten angegeben. Diese Empfehlung leitet sich daraus ab, dass das Arbeiten mit internen Tabellen meistens auch das Arbeiten mit großen Datenmengen bedeutet. Eine Standardanwendung von internen Tabellen ist es, viele Daten von der Datenbank in den Hauptspeicher zu laden, um sie dort schneller und effizienter zu verarbeiten. In solchen Fällen ist eine Betrachtung des Zeitaufwands der einzelnen Zugriffsarten unabdingbar:

Der Indexzugriff ist zwar prinzipiell der schnellste Zugriff auf eine Zeile einer internen Tabelle, da intern ein direkter Verweis besteht, er ist aber gerade beim Arbeiten mit Daten aus Datenbanktabellen häufig nicht der geeignete Zugriff. Bei Indexzugriffen muss das Programm die Zuordnung zwischen Index und Inhalt der Tabellenzeile kennen, während beim Schlüsselzugriff der Inhalt der Tabellenzeile selbst ausgewertet wird. Der Schlüsselzugriff ist deshalb für viele Anwendungen zwar geeigneter, aber auch langsamer.

Zugriffszeit

Die Zeit für einen Schlüsselzugriff hängt stark von der Tabellenart ab:

Bei Standardtabellen werden bei jedem Schlüsselzugriff sämtliche Zeilen linear nach dem Schlüsselwert durchsucht. Der mittlere Suchaufwand ist deshalb direkt proportional zur Anzahl der Zeilen.

Bei sortierten Tabellen führt die Laufzeitumgebung bei einem Schlüsselzugriff automatisch eine binäre Suche (Intervallsuche) nach dem Schlüsselwert durch. Der mittlere Suchaufwand ist proportional zu log2 von der Anzahl der Zeilen.

Bei Hash-Tabellen rechnet die Laufzeitumgebung die Position der Zeile über eine Hash-Funktion aus dem Schlüsselwert aus. Der Suchaufwand ist unabhängig von der Anzahl der Zeilen konstant.

Laufzeitmessung

Die folgende Abbildung zeigt eine exemplarische Messung der mittleren Laufzeit für Schlüsselzugriffe auf die verschiedenen Tabellenarten in Abhängigkeit von der Anzahl der Zeilen. Für jede der drei Tabellenarten wurden die Zeiten für den Schlüsselzugriff auf sämtliche Zeilen gemessen und deren Mittelwert gebildet. Ab ungefähr 50 Zeilen gehen die Kurven in den oben vorhergesagten Verlauf über. Beachten Sie den logarithmischen Maßstab der Darstellung. Bei 10.000 Zeilen ist der Zugriff auf eine Hash-Tabelle doppelt so schnell wie der Zugriff auf eine sortierte Tabelle und dieser 170 mal schneller als auf eine Standardtabelle.

Diese Grafik wird im zugehörigen Text erklärt

Je nach Verwendung einer internen Tabelle im Programm (Anzahl der Zei­len, Häufigkeit der Zugriffe) sollten Sie also unbedingt die passenden Tabellenarten verwenden. Bei kleinen Tabellen bis etwa 100 Zeilen oder solchen, bei denen keine oder nur wenige Schlüsselzugriffe erfolgen, können Standardtabellen verwendet werden. Große Tabellen, in denen keine doppelten Einträge vorkommen sollen und auf die nur über Schlüssel zugegriffen wird, sollten immer als Hash-Tabellen angelegt werden. Sortierte Tabellen sind immer dann günstig, wenn eine Tabelle unbedingt während der gesamten Laufzeit sortiert vorliegen muss.

Operationen für alle Tabellenarten

Diejenigen Operationen, die mit den Zeilen aller Tabellenarten durchgeführt werden können, sollten nur dann verwendet werden, wenn sie die einzig möglichen für die verwendete Tabellenart sind oder wenn zum Zeitpunkt der Programmerstellung die Tabellenart nicht festliegt (z.B. generische Formalparameter in Prozeduren).

Falls die Tabellenart feststeht, sollten aus Gründen der Performance auch die spezifischen Operationen verwendet werden. Beispielsweise sollten Index-Tabellen mit der dafür vorgesehenen Anweisung APPEND … TO gefüllt werden, während Hash-Tabellen oder generische Tabellen nur mit INSERT … INTO TABLE gefüllt werden können.

Operationen für Index-Tabellen

Manche Operationen können nur mit den Zeilen von Index-Tabellen (sortierte und Standard-Tabellen) und manche sogar nur mit den Zeilen von Standard-Tabellen durchgeführt werden. Da Indexzugriffe auf Tabellen aber immer schneller als Schlüsselzugriffe sind, sollten die spezifischen Indexoperationen immer verwendet werden, wenn es statisch feststeht, dass die interne Tabelle eine Index-Tabelle ist.

Insbesondere beim zeilenweisen Füllen ist das Anhängen von Tabellenzeilen an eine Standard-Tabelle die schnellstmögliche Methode, da bei Standardtabellen kein eindeutiger Schlüssel definiert werden kann und das Anhängen deshalb ohne Untersuchung der bereits vorhandenen Zeilen erfolgt. Wenn also doppelte Einträge in Kauf genommen oder anders ausgeschlossen werden können, kann es sinnvoll sein erst eine Standard-Tabelle zu füllen und diese dann zu sortieren oder einer sortierten Tabelle zuzuweisen, wenn der Datenbestand erst nach dem Füllen sortiert gehalten werden muss.

Weiterhin wurde zu Release 4.5A die Performance bei Operationen verbessert, bei denen der interne lineare Index verändert wird. Vorher wuchsen Indexmanipulationskosten beim Einfügen und Löschen von Zeilen in Standard-Tabellen und sortierten Tabellen linear mit der Zeilenzahl. Seit Release 4.5A wachsen die Indexmanipulationskosten nur noch logarithmisch mit der Zeilenzahl, da Tabellenindizes jetzt als Baum verwaltet werden. Damit können auch in sehr großen Standard-Tabellen und sortierten Tabellen Zeilen effizient eingefügt und gelöscht werden.

 

In den folgenden Kapiteln erfahren Sie mehr über:

Zugriffsmethoden auf einzelne Tabelleneinträge

Interne Tabellen zeilenweise füllen

Tabellenzeilen lesen

Tabellenzeilen in Schleifen bearbeiten

Tabellenzeilen ändern

Tabellenzeilen löschen

Interne Tabellen zeilenweise durchsuchen

Obsolete Anweisungen für interne Tabellen

Ende des Inhaltsbereichs