RUNSQLSTM/RUNSQL unterstützt natürlich keinen Select, wohin dann mit den Daten?
Analysieren kannst du aber auch mit ACS SQL-Script ausführen.

Ich bin nun nicht ganz im Detail durch gegangen, aber folgende Punkte ergeben sich:

select distinct kuns.gesid CD_CL_NR
from kun3sel kuns
sollte ersetzt werden mit

select kuns.gesid CD_CL_NR
from kun3sel kuns
group by CD_CL_NR

Da du mit diesem Konstrukt joinst, ist keine Indexverwendung möglich.

(case when dh.KR1_DEF_KLASSE='BO' then 0 else 1 end) = 1
Da würde doch
dh.KR1_DEF_KLASSE <> 'BO'
reichen?

Spätestens wenn du mit den Distinct-Selects joinst, fängt das Rechnen und Suchen an.
Zum Verständnis:

Ein CTE-Ausdruck ist keine temporäre Tabelle!
Der Join-Zugriff erfolgt je Zeile und berechnet den Inhalt erst mal komplett neu.

Die OLAP-Funktionen werden dann kritisch wenn man tatsächlich dann auf Berechnungsergebnisse filtert. Wenn man also nur die 1. Zeile eines Ergebnisses benötigt kann man

cross join lateral (
select ...... from .... join .... where ....
order by ....
fetch first 1 rows only
) y

verwenden. Lateral Joins werden auch wieder nur temporär für jeden Satz ausgeführt. Wenn Indizes vorhanden sind erfolgt auch nur 1 Zugriff.
Ich verwende den auch häufiger für skalare subselects wenn ich mehr als 1 Wert aus derselben Abfrage benötige.

Und sonst? Index, Index, Index, ...

Per ACS-SQL-Scripts kannst du auch den Advisor für die Performanceanalyse ausführen.