Sunteți pe pagina 1din 7

SELECT

/*

[NAME]

- HANA_ABAP_BatchJobs

[DESCRIPTION]

- Overview of ABAP batch jobs

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- Table TBTCO only available in SAP ABAP environments


- You have to be connected to the SAP<sid> schema otherwise the following error is
issued:

[259]: invalid table name: Could not find table/view TBTCO in schema

- If access to ABAP objects is possible but you cannot log on as ABAP user, you can
switch the default schema before executing the command:

SET SCHEMA SAP<sid>

[VALID FOR]

- Revisions: all
- Statistics server type: all
- Client application: ABAP

[SQL COMMAND VERSION]

- 2018/10/24: 1.0 (initial version)


- 2018/12/03: 1.1 (shortcuts for BEGIN_TIME and END_TIME like 'C', 'E-S900' or
'MAX')
- 2019/01/23: 1.2 (WP_PID included)

[INVOLVED TABLES]

- TBTCO

[INPUT PARAMETERS]

- BEGIN_TIME

Begin time

'2018/12/05 14:05:00' --> Set begin time to 5th of December 2018, 14:05
'C' --> Set begin time to current time
'C-S900' --> Set begin time to current time minus 900 seconds
'C-M15' --> Set begin time to current time minus 15 minutes
'C-H5' --> Set begin time to current time minus 5 hours
'C-D1' --> Set begin time to current time minus 1 day
'C-W4' --> Set begin time to current time minus 4 weeks
'E-S900' --> Set begin time to end time minus 900 seconds
'E-M15' --> Set begin time to end time minus 15 minutes
'E-H5' --> Set begin time to end time minus 5 hours
'E-D1' --> Set begin time to end time minus 1 day
'E-W4' --> Set begin time to end time minus 4 weeks
'MIN' --> Set begin time to minimum (1000/01/01 00:00:00)

- END_TIME

End time

'2018/12/08 14:05:00' --> Set end time to 8th of December 2018, 14:05
'C' --> Set end time to current time
'C-S900' --> Set end time to current time minus 900 seconds
'C-M15' --> Set end time to current time minus 15 minutes
'C-H5' --> Set end time to current time minus 5 hours
'C-D1' --> Set end time to current time minus 1 day
'C-W4' --> Set end time to current time minus 4 weeks
'B+S900' --> Set end time to begin time plus 900 seconds
'B+M15' --> Set end time to begin time plus 15 minutes
'B+H5' --> Set end time to begin time plus 5 hours
'B+D1' --> Set end time to begin time plus 1 day
'B+W4' --> Set end time to begin time plus 4 weeks
'MAX' --> Set end time to maximum (9999/12/31 23:59:59)

- JOB_NAME

Batch job name

'EU_REORG' --> Batch job EU_REORG


'%' --> No restriction related to batch job name

- USER_NAME

Batch job scheduling user

'SAPADM' --> User SAPADM


'%' --> No restriction related to batch job scheduling user

- MIN_DURATION_S

Threshold for minimum batch job duration

3600 --> Only consider batch jobs with a runtime of at least 3600
seconds
-1 --> No restriction related to batch job duration

- STATUS

Batch job status (check "Modification section" for all possible values)

'CANCELLED' --> Only display cancelled batch jobs


'%' --> No restriction related to batch job user

- AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'TIME' --> Aggregation by time


'HOST, PORT' --> Aggregation by host and port
'NONE' --> No aggregation

- TIME_AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'HOUR' --> Aggregation by hour


'YYYY/WW' --> Aggregation by calendar week
'TS<seconds>' --> Time slice aggregation based on <seconds> seconds
'NONE' --> No aggregation

- ORDER_BY

Sort criteria (available values are provided in comment)

'SIZE' --> Sorting by size


'TABLE' --> Sorting by table name

[OUTPUT PARAMETERS]

- START_TIME: Start time of considered time interval


- JOB_NAME: Batch job name
- USER_NAME: Scheduling user name
- STATUS: Batch job status
- WP_PID: Process ID of work process
- NUM_JOBS: Number of batch jobs
- TOT_DUR_S: Total duration (s)
- AVG_DUR_S: Average duration (s)

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
--------------
|START_TIME |JOB_NAME |USER_NAME|STATUS |NUM_JOBS|
TOT_DUR_S |AVG_DUR_S |
-----------------------------------------------------------------------------------
--------------
|2018/12/19 12:15:22|BI_PROCESS_ABAP |MAESTRO |CANCELLED| 1|
182546| 182546.00|
|2018/12/20 04:03:20|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125654| 125654.00|
|2018/12/20 04:03:22|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125648| 125648.00|
|2018/12/20 06:32:34|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
116714| 116714.00|
|2018/12/20 07:46:57|BIDTPR_2740096_1 |ALEREMOTE|CANCELLED| 1|
112251| 112251.00|
|2018/12/20 07:54:06|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111822| 111822.00|
|2018/12/20 07:54:05|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111805| 111805.00|
|2018/12/20 08:00:27|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111423| 111423.00|
|2018/12/20 08:29:31|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109697| 109697.00|
|2018/12/20 08:29:33|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109677| 109677.00|
|2018/12/20 08:59:15|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
107913| 107913.00|
|2018/12/20 09:29:30|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
106098| 106098.00|
|2018/12/20 09:31:42|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
105948| 105948.00|
|2018/12/20 09:38:48|BIDTPR_2740329_1 |ALEREMOTE|CANCELLED| 1|
105522| 105522.00|
|2018/12/20 09:55:53|BI_WRITE_PROT_TO_APPLLOG|ABCDEF |CANCELLED| 1|
104497| 104497.00|
|2018/12/22 12:15:10|BI_PROCESS_ABAP |MAESTRO |RUNNING | 1|
93905| 93905.00|
-----------------------------------------------------------------------------------
--------------

*/

START_TIME,
JOB_NAME,
USER_NAME,
STATUS,
LPAD(WP_PID, 7) WP_PID,
LPAD(NUM_JOBS, 8) NUM_JOBS,
LPAD(DURATION_S, 10) TOT_DUR_S,
LPAD(TO_DECIMAL(MAP(NUM_JOBS, 0, 0, DURATION_S / NUM_JOBS), 10, 2), 10) AVG_DUR_S
FROM
( SELECT
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END JOB_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END USER_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END STATUS,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END WP_PID,
COUNT(*) NUM_JOBS,
SUM(J.DURATION_S) DURATION_S,
BI.ORDER_BY
FROM
( SELECT
CASE
WHEN BEGIN_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN BEGIN_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-S'))
WHEN BEGIN_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-M') * 60)
WHEN BEGIN_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-H') * 3600)
WHEN BEGIN_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-D') * 86400)
WHEN BEGIN_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-W') * 86400 * 7)
WHEN BEGIN_TIME LIKE 'E-S%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-S'))
WHEN BEGIN_TIME LIKE 'E-M%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-M') * 60)
WHEN BEGIN_TIME LIKE 'E-H%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-H') * 3600)
WHEN BEGIN_TIME LIKE 'E-D%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-D') * 86400)
WHEN BEGIN_TIME LIKE 'E-W%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-W') * 86400 * 7)
WHEN BEGIN_TIME = 'MIN' THEN
TO_TIMESTAMP('1000/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(BEGIN_TIME, 1, 1) NOT IN ('C', 'E', 'M') THEN
TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS')
END BEGIN_TIME,
CASE
WHEN END_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN END_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-S'))
WHEN END_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-M') * 60)
WHEN END_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-H') * 3600)
WHEN END_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-D') * 86400)
WHEN END_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-W') * 86400 * 7)
WHEN END_TIME LIKE 'B+S%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+S'))
WHEN END_TIME LIKE 'B+M%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+M') * 60)
WHEN END_TIME LIKE 'B+H%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+H') * 3600)
WHEN END_TIME LIKE 'B+D%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+D') * 86400)
WHEN END_TIME LIKE 'B+W%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+W') * 86400 * 7)
WHEN END_TIME = 'MAX' THEN
TO_TIMESTAMP('9999/12/31 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(END_TIME, 1, 1) NOT IN ('C', 'B', 'M') THEN
TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS')
END END_TIME,
JOB_NAME,
USER_NAME,
MIN_DURATION_S,
WP_PID,
STATUS,
AGGREGATE_BY
AGGREGATE_BY,
MAP(TIME_AGGREGATE_BY,
'NONE', 'YYYY/MM/DD HH24:MI:SS',
'HOUR', 'YYYY/MM/DD HH24',
'DAY', 'YYYY/MM/DD (DY)',
'HOUR_OF_DAY', 'HH24',
TIME_AGGREGATE_BY ) TIME_AGGREGATE_BY,
ORDER_BY
FROM
( SELECT /* Modification section */
'1000/10/18 07:58:00' BEGIN_TIME, /* YYYY/MM/DD HH24:MI:SS
timestamp, C, C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>, E-
S<seconds>, E-M<minutes>, E-H<hours>, E-D<days>, E-W<weeks>, MIN */
'9999/10/18 08:05:00' END_TIME, /* YYYY/MM/DD HH24:MI:SS
timestamp, C, C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>,
B+S<seconds>, B+M<minutes>, B+H<hours>, B+D<days>, B+W<weeks>, MAX */
'%' JOB_NAME,
'%' USER_NAME,
86400 MIN_DURATION_S,
-1 WP_PID,
'%' STATUS, /* CANCELLED, FINISHED, SCHEDULED, RUNNING,
RELEASED, UNKNOWN, READY, PUT_ACTIVE */
'NONE' AGGREGATE_BY, /* TIME, JOB, USER, STATUS, WP_PID or
comma separated combinations, NONE for no aggregation */
'NONE' TIME_AGGREGATE_BY, /* HOUR, DAY, HOUR_OF_DAY or database
time pattern, TS<seconds> for time slice, NONE for no aggregation */
'DURATION' ORDER_BY /* TIME, JOB, USER, STATUS,
DURATION, COUNT */
FROM
DUMMY
)
) BI,
( SELECT
BEGIN_TIME,
END_TIME,
SECONDS_BETWEEN(BEGIN_TIME, IFNULL(END_TIME, CURRENT_TIMESTAMP)) DURATION_S,
STATUS,
JOB_NAME,
USER_NAME,
WPPROCID
FROM
( SELECT
MAP(STRTDATE, '00000000', NULL, TO_TIMESTAMP(STRTDATE || STRTTIME,
'YYYYMMDDHH24MISS')) BEGIN_TIME,
MAP(ENDDATE, '00000000', NULL, TO_TIMESTAMP(ENDDATE || ENDTIME,
'YYYYMMDDHH24MISS')) END_TIME,
MAP(STATUS, 'A', 'CANCELLED', 'F', 'FINISHED', 'P', 'SCHEDULED', 'R',
'RUNNING', 'S', 'RELEASED', 'X', 'UNKNOWN', 'Y', 'READY', 'Z', 'PUT_ACTIVE')
STATUS,
JOBNAME JOB_NAME,
SDLUNAME USER_NAME,
WPPROCID
FROM
TBTCO
WHERE
STRTDATE != '00000000'
)
) J
WHERE
J.JOB_NAME LIKE BI.JOB_NAME AND
J.BEGIN_TIME <= BI.END_TIME AND
( J.END_TIME = '' OR J.END_TIME >= BI.BEGIN_TIME ) AND
J.STATUS LIKE BI.STATUS AND
J.USER_NAME LIKE BI.USER_NAME AND
( BI.WP_PID = -1 OR J.WPPROCID = BI.WP_PID ) AND
( BI.MIN_DURATION_S = -1 OR J.DURATION_S >= BI.MIN_DURATION_S )
GROUP BY
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END,
BI.ORDER_BY
)
ORDER BY
MAP(ORDER_BY, 'JOB', JOB_NAME, 'USER', USER_NAME, 'STATUS', STATUS),
MAP(ORDER_BY, 'DURATION', DURATION_S, 'COUNT', NUM_JOBS) DESC,
START_TIME DESC

S-ar putea să vă placă și