DB2 Universal Database - Systemverwaltung
Dieser Abschnitt enthält bestimmte Aspekte und Richtlinien zur
Feinabstimmung der SQL-Anweisungen in einem Anwendungsprogramm.
Allgemein gilt, daß diese Richtlinien Sie beim Entwurf eines Programms
unterstützen können, mit dem der Bedarf an Systemressourcen und die benötigte
Zeit zum Zugriff auf Daten in einer sehr umfangreichen Tabelle minimiert
werden. Abhängig vom Grad der Optimierung bei der Kompilierung der
SQL-Anweisung ist eine Feinabstimmung der SQL-Anweisungen eventuell nicht
erforderlich. Der SQL-Compiler kann das SQL in eine effizientere Form
umschreiben. Siehe hierzu Umschreiben der Abfrage durch den SQL-Compiler und Anpassen der Optimierungsklasse.
Außerdem ist zu berücksichtigen, daß der vom Optimierungsprogramm gewählte
Zugriffsplan auch den Auswirkungen anderer Faktoren unterliegt, zu denen auch
Umgebungsaspekte und Systemkatalogstatistiken gehören. Bei der
Durchführung von Vergleichstests für Ihre Anwendungen können Sie Anpassungen
vornehmen, um den Zugriffsplan zu verbessern.
Die Sprache SQL ist eine sehr flexible höhere Programmiersprache.
Sie ermöglicht das Erstellen unterschiedlicher SELECT-Anweisungen,
mit denen dieselben Daten abgerufen werden können. Die Leistung kann
jedoch für die verschiedenen Formen und Optimierungsklassen unterschiedlich
sein.
Der SQL-Compiler (einschließlich der Phasen des Umschreibens und der
Optimierung von Abfragen) wählt einen Zugriffsplan, der die Ergebnismenge für
die codierte Abfrage liefert. Daher, wie auch in vielen der folgenden
Richtlinien vermerkt, sollten Sie die Abfrage so codieren, daß nur die
benötigten Daten abgerufen werden.
Für die Verwendung von SELECT-Anweisungen gelten folgende
Richtlinien:
- Geben Sie in der SELECT-Liste nur die Spalten an, die Sie
benötigen. Obwohl es einfacher ist, alle Spalten mit einem Stern (*)
anzugeben, kann dies zu unnötigem Verarbeitungsaufwand und der Rückgabe
unerwünschter Spalten führen.
- Begrenzen Sie die Anzahl der ausgewählten Zeilen, indem Sie
Vergleichselemente zur Einschränkung der Ergebnismenge auf die benötigten
Zeilen verwenden. (Weitere Informationen zu verschiedenen Arten von
Vergleichselementen und ihren relativen Auswirkungen auf die Leistung finden
Sie in Vergleichselementterminologie.)
- Wenn die Anzahl der Zeilen, die Sie verwenden möchten, bedeutend kleiner
ist als die Gesamtanzahl der Zeilen, die abgerufen werden könnten, geben Sie
die Klausel OPTIMIZE FOR in der SELECT-Anweisung an. Diese
Klausel wirkt sich auf die Auswahl der Zugriffspläne und die Anzahl der im
Kommunikationspuffer gesperrten Zeilen aus. (Weitere Informationen
finden Sie in Zeilenblockung.)
- Wenn die Anzahl der abzurufenden Zeilen klein ist, brauchen Sie die
Klausel OPTIMIZE FOR k ROWS zusätzlich zur Klausel FETCH FIRST n ROWS ONLY
nicht anzugeben. Wenn n jedoch groß ist und Sie den Vorgang optimieren
wollen, indem Sie die ersten k Zeilen schnell und die nachfolgenden k Zeilen
mit einer möglichen Verzögerung abrufen, geben Sie beide Klauseln an.
Die Größe der Kommunikationspuffer wird in Abhängigkeit vom kleineren Wert für
n oder k geändert.
SELECT EMPNAME, SALARY FROM EMPLOYEE
ORDER BY SALARY DESC
FETCH FIRST 100 ROWS ONLY
OPTIMIZE FOR 20 ROWS
- Durch die Angabe der Klausel FOR READ ONLY (oder FOR FETCH ONLY) kann die
Leistung verbessert werden, da sie der Abfrage erlaubt, die Zeilenblockung zu
nutzen. Diese Klausel kann auch den gemeinsamen Zugriff auf Daten
verbessern, da niemals exklusive Sperren (Exclusive) für Zeilen aktiviert
werden, die durch eine Abfrage mit dieser Klausel abgerufen werden.
Darüber hinaus ermöglicht diese Klausel ein weitergehendes Umschreiben der
Abfrage. Durch die Angabe der Klausel FOR READ ONLY (oder FOR FETCH
ONLY) zusammen mit BLOCKING ALL BIND kann die Leistung von Abfragen für
Kurznamen in einem System mit zusammengeschlossenen Datenbanken verbessert
werden.
- Durch die Angabe der Klausel FOR UPDATE kann auch die Leistung für Cursor,
die aktualisiert werden, verbessert werden, da sie dem Datenbankmanager
erlaubt, zu Beginn geeignetere Sperrmodi zu wählen, um potentielle
gegenseitige Sperren (siehe Gegenseitige Sperren) und Sperrenumwandlungen (siehe Sperrenumwandlung) zu vermeiden.
- Vermeiden Sie nach Möglichkeit Umsetzungen numerischer Datentypen.
Beim Vergleichen von Werten ist es in der Regel effizienter, zwei Werte mit
demselben Datentyp miteinander zu vergleichen. Wenn Umwandlungen
erforderlich sind, kann es zu Ungenauigkeiten aufgrund eingeschränkter
Präzision und zu Leistungseinbußen aufgrund von Umwandlungen, die zur Laufzeit
ausgeführt werden müssen, kommen.
Verwenden Sie, falls möglich, die folgenden Datentypen:
- Zeichen (CHAR) anstatt Zeichen variierender Länge (VARCHAR) für kurze
Spalten
- Ganze Zahlen (INTEGER) anstatt Gleitkommazahlen (FLOAT) oder Dezimalzahlen
(DECIMAL)
- Datum/Uhrzeit (DATETIME) anstatt Zeichen (CHAR)
- Numerische Datentypen anstatt Zeichen (CHAR)
- SQL-Anweisungen mit Klauseln oder Operationen wie DISTINCT oder ORDER BY
verlangen, daß die Daten sortiert werden, um die Operation ausführen zu
können. Wenn Sie die Wahrscheinlichkeit, daß eine Sortieroperation
ausgeführt wird, verringern möchten, geben Sie diese Klauseln nicht an, wenn
sie nicht unbedingt erforderlich sind.
- Zur Überprüfung, ob Zeilen in einer Tabelle enthalten sind, ist folgende
Anweisung
SELECT COUNT(*) FROM TABLENAME
mit anschließender Überprüfung auf einen Wert ungleich null nur dann
geeignet, wenn es sich um eine sehr kleine Tabelle handelt. Mit dem
Anwachsen der Tabelle kann das Zählen aller Zeilen nach und nach die Leistung
beeinträchtigen. Als Alternative bietet sich der Versuch an, eine
einzelne Zeile auszuwählen. Dies kann entweder durch Öffnen eines
Cursors und Abrufen einer Zeile oder durch eine Anweisung SELECT INTO für eine
einzige Zeile geschehen. (Vergessen Sie nicht, nach dem Fehler SQLCODE
-811 zu suchen, wenn von der SELECT-Anweisung mehr als eine Zeile
gefunden wird.)
- Wenn das Aktualisierungsaufkommen gering ist und die Tabellen umfangreich
sind, sollten Sie Indizes für Spalten definieren, die häufig in
Vergleichselementen verwendet werden.
- Ziehen Sie die Verwendung einer IN-Liste in Betracht, wenn dieselbe Spalte
in mehreren PREDICATE-Klauseln erscheint.
- Bei großen IN-Listen, die in Verbindung mit Host-Variablen verwendet
werden, können Schleifen in einer Untergruppe der Host-Variablen die Leistung
verbessern.
Die folgenden Vorschläge gelten insbesondere für
SELECT-Anweisungen, die auf mehrere Tabellen zugreifen.
- Verwenden Sie Verknüpfungsvergleichselemente, wenn Sie Tabellen
verknüpfen. (Ein Verknüpfungsvergleichselement ist ein Vergleich
zwischen zwei Spalten verschiedener Tabellen in einer Verknüpfung.)
- Definieren Sie Indizes für die Spalten in dem
Verknüpfungsvergleichselement, um eine effizientere Verarbeitung der
Verknüpfung zu ermöglichen. Davon profitieren auch UPDATE- und
DELETE-Anweisungen, die SELECT-Anweisungen enthalten, die auf mehrere Tabellen
zugreifen.
- Vermeiden Sie nach Möglichkeit Ausdrücke oder Klauseln OR mit
Verknüpfungsvergleichselementen. In einem solchen Fall können einige
Verknüpfungsmethoden vom Datenbankmanager nicht verwendet werden, was dazu
führen kann, daß nicht die effizienteste Verknüpfungsmethode ausgewählt
wird.
- Stellen Sie sicher (falls möglich), daß in einer partitionierten
Datenbankumgebung die verknüpften Tabellen beide über die Verknüpfungsspalte
partitioniert sind.
Weitere Informationen finden Sie im Abschnitt Verknüpfungskonzepte.
Weitere Informationen zur Codierung von SQL-Anweisungen mit Verknüpfungen
und Unterabfragen finden Sie auch im Handbuch Application
Development Guide.
[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]