was bewirkt die optimize for n rows - Klausel
Optimize for n rows ist eine Performance-Option des DECLARE CURSOR Statements. Sie gibt dem Optimizer Information über die erwartete ( bzw. benötigte ) Ergebnismenge, damit dieser seine Zugriffspfad-Entscheidung entsprechend treffen kann. Das primäre Ziel dieser Option ist es, der Rückgabe der ersten n Zeilen eine höhere Priorität einzuräumen als der Bereitstellung der gesamten Ergebnismenge.
Also: "Liebes DB2, gib mir die ersten n Zeilen des Ergebnisses möglichst schnell".
Dies kann sinnvoll sein, wenn nur wenige Ergebniszeilen benötigt werden ( weil z.B. am Bildschirm nur 12 Zeilen angezeigt werden können ), der SELECT jedoch eine größere Ergebnismenge liefert. Bei Angabe dieser Option versucht der Optimizer unter anderem, auf einen separaten Sort zu verzichten (der ja bedeuten würde, dass vorher die komplette Ergebnismenge ermittelt werden muss ), und statt dessen einen Index in Order By - Folge zu verwenden. Die Option hat keinen Einfluss auf den Inhalt der Resulttable, d.h. auch bei Vorgabe von Optimize for 1 Row können viele Ergebniszeilen entstehen und auch mit Fetch eingelesen werden ( allerdings dürfte sich dann die Performance global verschlechtern ). Ebenso kann mit der optimize - Klausel auch nicht die Sortierfolge bestimmt werden, in der DB2 die Ergebniszeilen liefert. Dazu ist ausschließlich die ORDER BY - Klausel zuständig.
Für den Einsatz der Optimize-Klausel gibt es folgende Empfehlungen:
- Sie sollte verwendet werden, wenn eine geringe Anzahl von Ergebniszeilen benötigt wird
- bei lokalen Zugriffen sollte dann immer Optimize for 1 row verwendet werden.
- bei remote Zugriffen sollte die tatsächlich benötigte Anzahl Zeilen angegeben werden.
- mittels EXPLAIN ist der Erfolg der Maßnahme zu überprüfen.