Ich habe diesbezüglich nun doch schon einiges ausprobiert.
Bei kleinen Datenmengen und simplen Abfragen ist das ja alles gut und schön.
Spätestens aber schon bei der Where-Klausel, die ja heute schon den Optimizer vor diverse Probleme stellt, ist das Verarbeiten und anschließende Verwerfen von Daten nicht gerade Performancesteigernd.
Wenn z.B. per "Offset 1001 Limit 20" also 1000 Aufrufe der UDF vergebens sind sollte ich mir wirklich Gedanken über den Sinn hier machen.
Auch bei "Group by ... having ... order by ..." besteht keine "Optimierung" außer eben der, die Berechnungen, Joins, Gruppierung und Sortierung durchzuführen um anschließend die ersten 1000 Ergebnisse weg zu schmeißen.

Was da im Untergrund abläuft ist mir da letztlich wurscht, für mich zählt das Ergebnis.
Man kann per STRSQL oder auch per QMQRY im Dialog ja sehr schön die Statususgabe betrachten und (wenn man dem Glauben schenken darf) durchaus mehrere Millionen Zugriffe angezeigt werden um wenige 100 Sätze zu bekommen.
Im Diagnose-Modus per ODBC kann man dann durchaus verfolgen, dass dann manchmal weniger als 100 Sätze/Sekunde von der AS/400 bereitgestellt werden und man sich dann fragt, was der Optimizer da mal wieder gemacht hat.
Und immer wieder tritt das z.B. beim Wechsel von V6 nach V7 auf da der Optimizer mal wieder optimiert wurde.