Suchaufwand klein halten
Die Treffermenge wird durch Einsatz der WHERE- und HAVING-Klauseln klein gehalten. Die Effizienz dieser Klauseln kann optimiert werden, indem sie passend zu den Indizes der Datenbanktabelle formuliert werden.
Datenbank-Indizes
Ein Index dient zur Unterstützung der schnelleren Selektion von Datenbankzeilen. Er besteht aus ausgewählten Feldern einer Datenbanktabelle, von denen eine Kopie in sortierter Reihenfolge angelegt wird. Bei richtiger Angabe von Indexfeldern in einer Bedingung der WHERE- oder HAVING-Klauseln, wird nur ein Teil des Index durchsucht (Index Range Scan).
Der Primärindex wird im R/3-System immer automatisch angelegt. Er setzt sich aus den Primärschlüsselfeldern der Datenbanktabelle zusammen. Es existiert also zu jeder Kombination der Felder des Indexes höchstens eine Zeile in der Tabelle. Ein solcher Index wird auch als UNIQUE bezeichnet.
Wenn der Primärindex nicht zur Bestimmung der Ergebnismenge benutzt werden kann, weil z.B. kein Feld des Primärindexes in einer Bedingung der WHERE oder HAVING-Klauseln vorkommt, wird die Tabelle vollständig durchsucht (Full Table Scan). In diesem Fall können Sekundärindizes angelegt werden, welche die zur Bestimmung der Ergebnismenge zu durchsuchenden Datensätze einschränken
Ein Sekundärindex wird mit dem Werkzeug ABAP Dictionary der ABAP Workbench angelegt. Dort können seine Spalten bestimmt werden und er kann als UNIQUE definiert werden. Allerdings sollte nicht für jede Kombination von Feldern in einer Bedingung ein Index definiert werden.
Ein Sekundärindex sollte dann angelegt werden, wenn nach Feldern selektiert wird, die noch in keinem Index enthalten sind, und die Performanz sehr schlecht ist. Weiterhin sollte ein Sekundärindex nur für Datenbanktabellen angelegt werden, auf die hauptsächlich lesend zugegriffen wird, da bei jeder Datenbankänderung auch der Index aktualisiert werden muß. Deshalb sollte sich ein Sekundärindex auch aus nicht mehr als vierFeldern zusammensetzen und es sollten nicht mehr als fünf Indizes für eine Datenbanktabelle angelegt werden.
Bei mehr als fünf Indizes pro Datenbanktabelle erhöht sich auch die Wahrscheinlichkeit, daß der Optimizer den falschen Index auswählt. Deshalb sollten bei mehreren Indizes pro Datenbanktabelle Überschneidungen vermieden werden.
Ein Sekundärindex sollte aus Spalten bestehen, über die häufig selektiert wird und die eine hohe Selektivität haben, d.h. es sollte geprüft werden, wieviel Prozent der Tabelleneinträge mit dieser Spalte selektiert werden. Je geringer dieser Prozentsatz ist, desto selektiver ist das Feld. Die selektivsten Felder sollten an den Anfang des Indexes gelegt werden. Ein neuer Sekundärindex sollte so selektiv sein, daß jedem Indexeintrag höchstens 5 Prozent der Einträge der Tabelle entsprechen. Andernfalls lohnt sich das Anlegen des Indexes nicht. Ein Index sollte auch nicht über schwach besetzte Felder, deren Feldwert für die meisten Sätze der Tabelle initial ist, angelegt werden.
Sind alle in der SELECT-Klausel angegebenen Spalten gleichzeitig im Index, so muß nach dem Indexzugriff kein zweiter Zugriff auf die eigentlichen Daten erfolgen. Werden in der SELECT-Klausel nur sehr wenige Spalten angegeben, lassen sich deutliche Performancegewinne erzielen, wenn diese Spalten alle mit in den Index aufgenommen werden.
Formulierung von Bedingungen für Indizes
Folgendes ist bei Bedingungen in WHERE- und HAVING-Klauseln zu beachten, damit die Suche auf den Indizes der Datenbanktabellen stattfindet und nicht als Full Table Scan:
Gleichheitsbedingungen mit AND verwenden
Die Indexsuche des Datenbanksystems ist besonders effizient, wenn alle Index-Felder mit dem Gleichheitsoperator (EQ, =) geprüft und durch AND verknüpft werden.
Positive Bedingungen verwenden
Das Datenbanksystem unterstützt nur solche Bedingungen durch einen Index, die den Suchwert positiv beschreiben, wie z.B. EQ oder LIKE. Bedingungen, die dagegen mit NE oder NOT LIKE angegeben sind, werden nicht unterstützt.
In Bedingungen sollte wenn möglich nicht das logische NOT, sondern entsprechend invertierte Operatoren verwendet werden, da das logische NOT nicht durch Datenbankindizes unterstützt wird.
Verwendung von OR
Der Optimizer hört in der Regel auf zu optimieren, wenn in der Bedingung eine Verknüpfung durch OR auftritt, d.h. er verwertet die mit OR geprüften Spalten nicht mehr bei der Auswahl und Anwendung des Indexes. Eine Ausnahme bilden die ORs, die ganz außen stehen. Deshalb sollte eine Bedingung, die eine OR-Verknüpfung auf einer für die Indexwahl relevanten Spalte besitzt, z.B. in eine IN-Bedingung umformuliert werden.
Verwendung eines Teils eines Index
Wenn ein Index aus mehreren Spalten zusammengesetzt ist, kann das Datenbanksystem ihn auch verwenden, wenn nur einige dieser Spalten in einer Bedingung angegeben sind. Allerdings spielt die Reihenfolge der im Index angegebenen Spalten eine wichtige Rolle. Eine Spalte kann im allgemeinen nur dann verwendet werden, wenn alle vor ihr in der Indexdefinition liegenden Spalten vollständig in der Bedingung angegeben sind.
Null-Wert prüfen
Bei der Bedingung IS NULL kann es zu Problemen kommen. Der Null-Wert wird bei einigen Datenbanksystemen nicht in der Indexstruktur abgelegt, was zur Folge haben kann, daß der Index für dieses Feld nicht verwendet wird.
Keine komplexen Bedingungen
Bedingungen sollten nicht zu komplex sein, da die entsprechenden Anweisungen vom Datenbanksystem in mehrere Einzelanweisungen zerlegt werden müssen.