Der SQL-Compiler erstellt keine temporären Indizes (wäre ja noch schöner).

Alles zusammen wird in ein SQLPKG gepackt und in das Modul eingebettet (PRTSQLINF).
Zur Laufzeit werden dann die Optimierungen durchgeführt.
Ohne Prepare läuft aber sowieso nichts.
Statische SQL's werden bei der Verwendung "prepared", Dynamische SQL's werden entweder manuell per Prepare oder automatisch beim "Execute direct" prepared.
Dabei übernimmt die SQL-Runtime die Analyse.
Es werden (häufig) Konstanten dann automatisch in temporäre Hostvariablen überführt und Parametermarker eingesetzt (warum auch immer).
Es ist sogar noch nicht mal gewährleistet, dass 2 Open's mit unterschiedlichen Parametern den selben Zugriffsweg benutzen wobei nur die Wahrscheinlichkeit eben hoch ist.

Verschärft wird das seit V7R1 dahingehend, dass alle Namen zur Laufzeit geprüft werden müssen, ob sie in den Tabellen oder als Variable vorhanden sind.
Der Precompiler wirft nämlich keine Fehler mehr aus, wenn man sich bei Feldnamen vertippt hat.
Er geht nun davon aus, dass dies ja später vorhandene Variablen sein könnten.
Man kann also solche Fehler dann erst zur Laufzeit und nicht mehr zur Compilezeit finden zumal man bestimmte Buchstabendreher ja gerne überliest.