Hallo zusammen,
ich hoffe auf Hilfe bei meinem Problem; Performance-Probleme wurden sicher schon des Öfteren behandelt, aber ich habe aus meiner Sicht so ziemlich alles versucht was machbar ist.
Generell geht es darum, dass ich aus einer Tabelle DSWP_BPM_ALERTS (Business Process Monitoring alerts) Werte in eine interne Tabelle selektiere; dies klappt soweit auch ohne Probleme:
select * from DSWP_BPM_ALERTS into TABLE it_bpm_alerts where
DSWP_BPM_ALERTS~ADATE in so_date and
DSWP_BPM_ALERTS~alert in so_alert and
DSWP_BPM_ALERTS~sessno in so_sess and
DSWP_BPM_ALERTS~sid in so_sid.
Anschließend wird ein Loop über die interne Tabelle ausgeführt und mittels des Aufrufs einer Klasse werden zusätzliche Daten ermittelt und in die Ergebnistabelle
geschrieben:
loop at it_bpm_alerts into lv_bpm_alerts.
CALL METHOD CL_AGS_BPM_OPERATIONS=>GET_ALERTTYPE_CONTEXT
EXPORTING
IV_SOLUTION = lv_bpm_alerts-solution
IV_MONID = lv_bpm_alerts-monid
IV_ALERTTYPE = lv_bpm_alerts-alerttype
IMPORTING
EV_MONOBJNAME = lv_result-MONOBJNAME
ET_CONTEXTS = lt_context.
select single text from DSWP_BPM_MONIDS into lv_result-ALERTTYPEDESCR where
monid = lv_bpm_alerts-monid.
read TABLE lt_context index 1 into lv_context.
lwa_result-POBJECT_NAME = lv_context-PROCESS_DESCR.
lwa_result-SOBJECT_NAME = lv_context-STEP_DESCR.
lwa_result-BUSISCENARIO_NAME = lv_context-SCENARIO_DESCR.
lwa_result-SOLUTION_NAME = lv_context-SOLUTION_DESCR.
lwa_result-RATING = lv_bpm_alerts-rating.
lwa_result-ATEXT = lv_bpm_alerts-atext.
lwa_result-AL_MEAS_VALUE = lv_bpm_alerts-al_meas_value.
lwa_result-SID = lv_bpm_alerts-SID.
lwa_result-CLIENT = lv_bpm_alerts-mandt.
lwa_result-adate = lv_bpm_alerts-adate.
lwa_result-atime = lv_bpm_alerts-atime.
append lv_result to lt_result.
endloop.
Ich habe hier auch einmal eine Laufzeitanalyse mit der Transaktion SAT durchgeführt und das Ergebnis war, dass die Datenbank für 99% der sehr langen Laufzeit erforderlich ist; bei einer Einschränkung auf ca. 1200 Datensätze dauert es ca. 20 Minuten bis die Auswertung abgeschlossen ist und das Ergebnis in der ALV-Liste angezeigt wird. Man kann sich vorstellen wie lange es dauert wenn es 10x so viele Datensätze sind.
Ich habe aus der Laufzeitanalyse den Eindruck gewonnen, dass die Klassenschnittstelle CL_AGS_BPM_OPERATIONS=>GET_ALERTTYPE_CONTEXT für die überlange Laufzeit verantwortlich ist und sehe hier nur wenig Optimierungspotential.
Ich habe im Programmcode selbst versucht die Auswertung zu beschleunigen indem ich bspw. ein Feldsymbol anstelle der work-area verwendet habe, aber die Laufzeit hat sich dadurch kaum verbessert.
Vielleicht sehe ich gerade den Wald vor lauter Bäumen nicht; ich bin jedenfalls für jede Hilfe dankbar.
LG,
Alex