DB2 Universal Database - Systemverwaltung


Einschränkungen für Ergebnismengen zur Leistungsverbesserung

Durch eine Anweisung SELECT wird eine Menge von Zeilen definiert, die die angegebenen Suchkriterien erfüllen. Das DB2-Optimierungsprogramm geht davon aus, daß die Anwendung alle die Kriterien erfüllenden Zeilen abrufen wird. Diese Annahme ist in OLTP-Umgebungen und bei Stapelbetrieb in der Regel zutreffend. Bei reinen Such- bzw. Anzeigeanwendungen hingegen werden durch die Abfragen häufig potentiell sehr umfangreiche Antwortmengen definiert, von denen aber normalerweise nur so viele Zeilen abgerufen werden, wie auf eine Bildschirmanzeige passen.

Die vom Optimierungsprogramm standardmäßig zugrundegelegte Annahme, daß alle den Kriterien entsprechenden Zeilen abgerufen werden, ist für Anwendungen, die Informationen in den gespeicherten Daten weder aktualisieren noch löschen, vielleicht nicht die günstigste.

Es gibt vier Möglichkeiten, die Anweisung SELECT zur Begrenzung bzw. Änderung der Ergebnistabelle zur Leistungsverbesserung zu ändern. Diese sind:

Klausel FOR UPDATE

Mit der Klausel FOR UPDATE werden die Spalten angegeben, die von einer nachfolgenden positionierten Anweisung UPDATE aktualisiert werden können. Bei der Angabe der Klausel FOR UPDATE ohne Spaltennamen werden alle Spalten, die aktualisiert werden können, in der Tabelle oder Sicht mit eingeschlossen. Bei Angabe von Spaltennamen muß jeder Name unqualifiziert angegeben werden und eine Spalte der Tabelle oder Sicht bezeichnen.

Die Klausel FOR UPDATE kann nicht verwendet werden, wenn eine der folgenden Bedingungen zutrifft:

Durch die Verwendung des DB2-CLI-Verbindungsattributs SQL_ATTR_ACCESS_MODE in CLI-Anwendungen können Sie die gleichen Ergebnisse erzielen. Weitere Informationen hierzu finden Sie im Abschnitt SQLSetConnectAttr() des Handbuchs CLI Guide and Reference.

Klausel FOR READ oder FETCH ONLY

Mit der Klausel FOR READ ONLY wird sichergestellt, daß die Ergebnistabelle schreibgeschützt (Nur-Lesezugriff) ist. Die Klausel FOR FETCH ONLY hat die gleiche Funktion.

Einige Ergebnistabellen lassen per Definition nur einen Lesezugriff zu. Dies ist zum Beispiel bei einer Ergebnistabelle nach einer Anweisung SELECT auf eine Sicht, die als schreibgeschützt definiert ist, der Fall. In diesem Fall ist die Angabe der Klausel FOR READ ONLY zwar zulässig, jedoch hat die Klausel keine Wirkung.

Bei Tabellen, für die Aktualisierungen und Löschungen zulässig sind, kann die Angabe der Klausel FOR READ ONLY die Leistung von Abrufoperationen (FETCH) verbessern. Diese mögliche Verbesserung der Leistung tritt ein, wenn der Datenbankmanager Datenblockungen vornehmen kann, anstatt exklusive Sperren für die Daten zu aktivieren. Die Klausel FOR READ ONLY sollte zur Verbesserung der Leistung verwendet werden außer in Fällen, in denen Abfragen in Anweisungen für positionierte Aktualisierungen (UPDATE) bzw. Löschungen (DELETE) verwendet werden.

Durch die Verwendung des DB2-CLI-Verbindungsattributs SQL_ATTR_ACCESS_MODE in CLI-Anwendungen können Sie die gleichen Ergebnisse erzielen. Weitere Informationen finden Sie im Abschnitt SQLSetConnectAttr() des Handbuchs CLI Guide and Reference.

Klausel OPTIMIZE FOR n ROWS

Die Klausel OPTIMIZE FOR gibt Anwendungen die Möglichkeit, die Absicht zu erklären, nur eine Untermenge des Ergebnisses abzurufen bzw. den Abruf der ersten paar Zeilen mit Priorität zu behandeln. Wenn diese Absicht bekannt ist, kann das Optimierungsprogramm solchen Zugriffsplänen Priorität einräumen, die die Antwortzeit zum Abruf der ersten paar Zeilen minimieren. Darüber hinaus wird die Anzahl der Zeilen, die als ein Block an den Client gesendet werden (siehe Zeilenblockung), durch den Wert "n" der Klausel OPTIMIZE FOR begrenzt. Daher beeinflußt die Klausel OPTIMIZE FOR sowohl die Art und Weise, wie die den Kriterien entsprechenden Zeilen aus der Datenbank vom Server abgerufen werden, als auch die Art und Weise, wie diese Zeilen an den Client zurückgegeben werden.

Nehmen Sie zum Beispiel an, Sie führen regelmäßig eine Abfrage nach den Mitarbeitern mit den höchsten Gehältern für die Tabelle EMPLOYEE aus.

     SELECT LASTNAME,FIRSTNAME,EMPNO,SALARY
     FROM EMPLOYEE
     ORDER BY SALARY DESC

Sie haben einen absteigenden Index für die Spalte SALARY definiert. Da jedoch die Mitarbeiter nach der Personalnummer (Spalte EMPNO) geordnet sind, weist der Index für die Spalte SALARY wahrscheinlich eine geringe Clusterbildung auf. In dem Bemühen, zahlreiche wahlfreie synchrone E/A-Operationen zu vermeiden, wählt das Optimierungsprogramm wahrscheinlich die Zugriffsmethode des Vorablesezugriffs über Listen (siehe Vorablesezugriff über Listen), für die die Zeilenkennungen (RIDs, Satz-IDs) aller den Suchkriterien entsprechenden Zeilen sortiert sein müssen. Dies kann dazu führen, daß die ersten Ergebniszeilen mit einer Verzögerung an die Anwendung zurückgegeben werden. In einem solchen Fall könnte die Klausel OPTIMIZE FOR der Anweisung folgendermaßen hinzugefügt werden:

     SELECT LASTNAME,FIRSTNAME,EMPNO,SALARY
     FROM EMPLOYEE
     ORDER BY SALARY DESC
     OPTIMIZE FOR 20 ROWS

Das Optimierungsprogramm wählt nun wahrscheinlich direkt den Index für die Spalte SALARY, da nun bekannt ist, daß aller Wahrscheinlichkeit nach nur die ersten zwanzig Mitarbeiter mit den höchsten Gehältern abgerufen werden. Unabhängig davon, wie viele Zeilen geblockt werden könnten, wird nun alle zwanzig Zeilen ein Zeilenblock an den Client zurückgegeben.

Die Klausel OPTIMIZE FOR veranlaßt das Optimierungsprogramm, solche Zugriffspläne zu bevorzugen, die Operationen an umfangreichen Datenmengen bzw. Operationen, die den Zeilenfluß unterbrechen (z. B. Sortierungen), vermeiden. Am ehesten wird ein Zugriffspfad durch die Klausel OPTIMIZE FOR 1 ROW beeinflußt. Die Verwendung dieser Klausel könnte folgende Auswirkungen haben:

Obwohl die Klausel OPTIMIZE FOR in allen Optimierungsklassen gültig ist (siehe Anpassen der Optimierungsklasse), zeigt sie für Klassen ab Optimierungsklasse 3 die besten Ergebnisse. Die Verwendung der Methode der schnellen Verknüpfungsaufzählung (Greedy Join Enumeration) (siehe Suchstrategien zur Auswahl der optimalen Verknüpfungsmethode) in den Optimierungsklassen unter 3 führt manchmal zu Zugriffsplänen für Verknüpfungen mehrerer Tabellen, die für ein schnelles Abrufen der ersten wenigen Zeilen nicht geeignet sind.

Die Klausel OPTIMIZE FOR bewirkt nicht, daß das Abrufen aller Ergebniszeilen unmöglich wird. Aber das Abrufen aller Ergebniszeilen kann wesentlich länger dauern, als wenn das Optimierungsprogramm zur Optimierung der gesamten Anwortmenge angewiesen worden wäre.

Wenn Sie eine Paketanwendung haben, die Call Level Interface (DB2 CLI oder ODBC) verwendet, ist es möglich, DB2 CLI automatisch unter Verwendung des Schlüsselworts OPTIMIZEFORNROWS in der Konfigurationsdatei db2cli.ini eine Klausel OPTIMIZE FOR an das Ende jeder Abfrageanweisung anfügen zu lassen. Weitere Informationen dazu finden Sie im Handbuch CLI Guide and Reference.

Beim Auswählen von Daten aus Kurznamen können die Ergebnisse abhängig von der Unterstützung durch die Datenquelle unterschiedlich sein. Wenn die durch den Kurznamen angegebene Datenquelle die Klausel OPTIMIZE FOR unterstützt und das Optimierungsprogramm die gesamte Abfrage, die die Klausel enthält, an die Datenquelle verschiebt (Pushdown), wird die Klausel im fernen SQL generiert, das an die Datenquelle gesendet wird. Wenn die Datenquelle diese Klausel nicht unterstützt oder das Optimierungsprogramm beschließt, die Klausel lokal auszuführen (Plan des geringsten Aufwands), wird die Klausel OPTIMIZE FOR lokal in DB2 angewandt. In diesem Fall räumt das DB2-Optimierungsprogramm auch weiterhin Zugriffsplänen Priorität ein, die die Antwortzeit für das Abrufen der ersten paar Zeilen einer Abfrage minimieren, aber die dem Optimierungsprogramm zur Verfügung stehenden Optionen zur Generierung von Plänen sind etwas beschränkt, und die Leistungsgewinne aus der Klausel OPTIMIZE FOR können möglicherweise vernachlässigt werden.

Wenn sowohl die Klausel FETCH FIRST als auch die Klausel OPTIMIZE FOR angegeben werden, wird der niedrigere der beiden Werte zur Beeinflussung der Größe des Kommunikationspuffers herangezogen. Die beiden Werte werden zu Optimierungszwecken als unabhängig voneinander betrachtet. Im Abschnitt Verwenden einer SELECT-Anweisung finden Sie weitere Informationen über das Zusammenwirken dieser beiden Klauseln.

Klausel FETCH FIRST n ROWS ONLY

Die Klausel OPTIMIZE FOR n ROWS bewirkt nicht, daß das Abrufen aller Ergebniszeilen unmöglich wird. (Das Abrufen aller Ergebniszeilen kann wesentlich länger dauern, als wenn das Optimierungsprogramm zur Optimierung der gesamten Anwortmenge angewiesen worden wäre.)

Die Klausel FETCH FIRST n ROWS ONLY legt die maximale Anzahl von Zeilen fest, die in einer SELECT-Anweisung abgerufen werden können. Die Beschränkung der Ergebnistabelle auf die ersten paar Zeilen kann die Leistung erhöhen. Es werden nur n Zeilen abgerufen, ungeachtet der Anzahl von Zeilen, die sich in der nach einer SELECT-Anweisung ohne diese Klausel erstellten Ergebnistabelle befänden.

Wenn sowohl die Klausel FETCH FIRST als auch die Klausel OPTIMIZE FOR angegeben werden, wird der niedrigere der beiden Werte zur Beeinflussung der Größe des Kommunikationspuffers herangezogen. Die beiden Werte werden zu Optimierungszwecken als unabhängig voneinander betrachtet. Im Abschnitt Verwenden einer SELECT-Anweisung finden Sie weitere Informationen über das Zusammenwirken dieser beiden Klauseln.

Anweisung DECLARE CURSOR WITH HOLD

Wenn Sie einen Cursor mit der Anweisung DECLARE CURSOR deklarieren, die die Klausel WITH HOLD enthält, bleiben alle geöffneten Cursor nach dem Festschreiben der Transaktion geöffnet. Darüber hinaus werden alle Sperren freigegeben, mit Ausnahme solcher Sperren, die die aktuelle Cursorposition geöffneter, mit WITH HOLD deklarierter Cursor schützen.

Wenn Sie einen Cursor mit der Anweisung DECLARE CURSOR deklarieren, die die Klausel WITH HOLD enthält, werden alle geöffneten Cursor geschlossen, wenn die Transaktion mit einer ROLLBACK-Operation beendet wird. Darüber hinaus werden alle Sperren freigegeben und LOB-Querverweise gelöscht.

Einen Vergleich zur anderen primären Klausel der Anweisung CLOSE CURSOR finden Sie im Abschnitt Anweisung CLOSE CURSOR WITH RELEASE.

Durch die Verwendung des DB2-CLI-Verbindungsattributs SQL_ATTR_CURSOR_HOLD in CLI-Anwendungen können Sie die gleichen Ergebnisse erzielen. Weitere Informationen hierzu finden Sie im Abschnitt "SQLSetStmtAttr - Set Options Related to a Statement" des Handbuchs CLI Guide and Reference.

Wenn Sie eine Paketanwendung haben, die Call Level Interface (DB2 CLI oder ODBC) verwendet, kann über das Schlüsselwort CURSORHOLD in der Konfigurationsdatei db2cli.ini angegeben werden, daß DB2 CLI annehmen soll, daß für jeden deklarierten Cursor die Klausel WITH HOLD angegeben wurde. Weitere Informationen hierzu finden Sie im Abschnitt zu Schlüsselwörtern der Transaktionskonfiguration im Handbuch CLI Guide and Reference.


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]