You are on page 1of 9

SELECT

/*

[NAME]

- HANA_ABAP_SDFSMON_FilterAndAggregation

[DESCRIPTION]

- Analysis of /SDF/SMON monitoring data

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- /SDF/SMON only available in SAP ABAP environments


- Data only available if /SDF/SMON is enabled, /SDF/MON is not sufficient
- 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 /SDF/SMON_WPINFO in schema

[VALID FOR]

- Revisions: all
- Statistics server type: all

[SQL COMMAND VERSION]

- 2017/02/16: 1.0 (initial version)

[INVOLVED TABLES]

- /SDF/SMON_WPINFO

[INPUT PARAMETERS]

- BEGIN_TIME

Begin time

TO_TIMESTAMP('2014/06/05 14:05:00', 'YYYY/MM/DD HH24:MI:SS') --> Set begin time


to 5th of June 2014, 14:05
ADD_DAYS(CURRENT_TIMESTAMP, -2) --> Set begin time
to two days before current time

- END_TIME

End time

TO_TIMESTAMP('2014/06/08 14:05:00', 'YYYY/MM/DD HH24:MI:SS') --> Set end time to


8th of June 2014, 14:05
CURRENT_TIMESTAMP --> Set end time to
current time

- APP_SERVER
SAP application server

'sapabap01' --> Restrict output to application server sapabap01


'%' --> No restriction related to SAP application server

- MANDT

SAP ABAP client

'100' --> Only show work processes related to client 100


'%' --> No restriction related to SAP ABAP client

- WP_TYPE

SAP ABAP work process type (e.g. DIA, ENQ, BTC, UPD)

'DIA' --> Restrict output to dialog work processes


'%' --> No restriction related to work process type

- WP_ID

SAP ABAP work process ID

23 --> Show information for work process 23


-1 --> No restriction related to work process ID

- CPID

Client process ID (i.e. process ID of SAP ABAP work process)

1234 --> Show information for work process with client process ID
1234
-1 --> No restriction related to client process ID

- ACTION

SAP ABAP work process action

'SELECT' --> Restrict output to SELECT operations


'%' --> No restriction related to work process action

- TABLE_NAME

Accessed table name

'MARA' --> Restrict output to accesses to table MARA


'%' --> No restriction related to table name

- STATE

SAP ABAP work process state

'SYNC RFC' --> Restrict output to work processes in state SYNC RFC
'%' --> No process state restriction

- WAITING_FOR

Wait situation
'CMSEND%' --> Display only work processes waiting for CMSEND
'%' --> No restriction related to wait situation

- APP_USER

Application user

'SAPSYS' --> Application user 'SAPSYS'


'%' --> No application user restriction

- APP_SOURCE

Application source

'SAPL2' --> Application source 'SAPL2:437'


'SAPMSSY2%' --> Application sources starting with SAPMSSY2
'%' --> No application source restriction

- REQUEST_TYPE

Type of root request

'RFC%' --> Restrict results to RFC requests


'%' --> No restriction related to request type

- BATCH_JOB

Batch job name

'MYBATCH1' --> Only show information for batch job MYBATCH1


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

- 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
- SAMPLES: Number of samples
- APP_SERVER: Application server name
- MANDT: SAP ABAP client
- TYP: Work process type (e.g. DIA, BTC, UPD)
- WP_ID: Work process ID
- CPID: Client process ID (i.e. OS PID of work process)
- DB_ROWS: Database rows retrieved
- DB_TIME_MS: Database time spent (ms)
- ACTION: Action (e.g. SELECT, ENQUEUE, ROLL IN, INSERT, UPDATE)
- TABLE_NAME: Accessed table name (only one table displayed in case of joins)
- STATE: Work process state
- APP_USER: Application user
- APP_SOURCE: Application source (main ABAP module -> current ABAP module)
- REQUEST_TYPE: Root request type
- BATCH_JOB: Batch job name
- WAITING_FOR: Wait reason

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
----------------------------
|START_TIME |APP_SERVER |MANDT|TYP|WP_ID|CPID |DB_ROWS |DB_TIME_S |
ACTION |TABLE_NAME |STATE |APP_USER |APP_SOURCE
|BATCH_JOB |WAITING_FOR
|
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
----------------------------
|2017/02/15 12:01:00|saphana0_E9A_02| 103|DIA| 33| 20032| 0| 0.00|
SELECT |LQUA | |RUPUZIDAEK |SAPML03T -> SAPLL03A
| |
|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|DIA| 34| 20033| 1227| 0.27|
| | |JOBRUN |SAPMSSY1 -> SAPLVEDA
| |
|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|DIA| 66| 20066| 0| 0.00|
SELECT |COST | |PUZUTTIOBA |/GLB/RGTPTR_PROCESS_ORDER_VAR ->
SAPLKARS | |
|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|DIA| 77| 28920| 361| 0.51|
| |SYNC RFC |BGVASILEVA |RVV50R10C -> SAPLATPC
| |CMSEND(SAP) / 13410508 / SYNC_CPIC /
141.122.207.43|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|BTC| 113| 1876| 833| 0.88|
SELECT |VBFA | |JOBRUN |/EUR/ODECSR_COD_PROCESS ->
SAPLV05C |RU_R3E_CS_R_0065295_SDBLRU3AIMSP|
|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|BTC| 117| 22492| 283| 0.18|
| | |JOBRUN |SAPMV45A -> SAPLV69A
|IT_R3E_CS_R_0060246_ORDERS_E |
|
|2017/02/15 12:01:00|saphana0_E9A_02| 103|BTC| 119| 11503| 0| 0.00|
| |ABAP WAIT|NBNRA |/GLB/RGTFCR_INVOICE_JOB
|5200637291201720170215120040 |CMRCV / 77113581 / SYNC_CPIC
|
|2017/02/15 12:01:00|saphana1_E9A_02| 103|DIA| 8| 5335| 384| 0.57|
SELECT |LIKP | |BGMIHAYLAL1 |SAPMSSY1 -> SAPLV61B
| |
|
|2017/02/15 12:01:00|saphana1_E9A_02| 103|DIA| 22| 30973| 481| 0.64|
SELECT |/GLB/RGTNOSHPORD| |BGMIHAYLAL1 |SAPMSSY1 -> SAPLV61B
| |
|
|2017/02/15 12:01:00|saphana1_E9A_02| 103|DIA| 37| 30642| 0| 0.00|
SELECT |TRFCQOUT | |PUMAIZNEBA |SAPMSSY1 -> SAPLORFC
| |
|
|2017/02/15 12:01:00|saphana1_E9A_02| 103|DIA| 51| 5380| 0| 0.00|
| | |OSS_481396 |SAPMSSY1 ->
CL_SERVER_INFO================CP | |
|
|2017/02/15 12:01:00|saphana1_E9A_02| 103|DIA| 60| 30643| 1197| 0.92|
SELECT |EKBE | |DESERWEFL |RM06EL00 -> SAPLME07
| |
|
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
----------------------------

*/

START_TIME,
LPAD(NUM, 7) SAMPLES,
APP_SERVER,
LPAD(MANDT, 5) MANDT,
WP_TYPE TYP,
LPAD(WP_ID, 5) WP_ID,
LPAD(CPID, 6) CPID,
LPAD(DB_ROWS, 9) DB_ROWS,
LPAD(TO_DECIMAL(DB_TIME_MS / 1000, 10, 2), 10) DB_TIME_S,
ACTION,
TABLE_NAME,
STATE,
APP_USER,
APP_SOURCE,
REQUEST_TYPE,
BATCH_JOB,
WAITING_FOR
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'), S.START_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(S.START_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SERVER') != 0
THEN S.SERVER ELSE MAP(BI.APP_SERVER, '%', 'any', BI.APP_SERVER)
END APP_SERVER,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'MANDT') != 0
THEN S.TENANT ELSE MAP(BI.MANDT, '%', 'any', BI.MANDT)
END MANDT,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_ID') != 0
THEN TO_VARCHAR(S.WP_INDEX) ELSE MAP(BI.WP_ID, -1, 'any',
TO_VARCHAR(BI.WP_ID)) END WP_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_TYPE') != 0
THEN S.WP_TYPE ELSE MAP(BI.WP_TYPE, '%', 'any', BI.WP_TYPE)
END WP_TYPE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CPID') != 0
THEN TO_VARCHAR(S.PID) ELSE MAP(BI.CPID, -1, 'any',
TO_VARCHAR(BI.CPID)) END CPID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'ACTION') != 0
THEN S.ACTION ELSE MAP(BI.ACTION, '%', 'any', BI.ACTION)
END ACTION,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TABLE') != 0
THEN S.TABLE_NAME ELSE MAP(BI.TABLE_NAME, '%', 'any', BI.TABLE_NAME)
END TABLE_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATE') != 0
THEN S.STATE ELSE MAP(BI.STATE, '%', 'any', BI.STATE )
END STATE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WAITING') != 0
THEN S.WAITING_FOR ELSE MAP(BI.WAITING_FOR, '%', 'any', BI.WAITING_FOR)
END WAITING_FOR,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_USER') != 0
THEN S.USER_NAME ELSE MAP(BI.APP_USER, '%', 'any', BI.APP_USER)
END APP_USER,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_SOURCE') != 0
THEN S.APP_SOURCE ELSE MAP(BI.APP_SOURCE, '%', 'any', BI.APP_SOURCE)
END APP_SOURCE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'REQUEST') != 0
THEN S.REQUEST_TYPE ELSE MAP(BI.REQUEST_TYPE, '%', 'any', BI.REQUEST_TYPE)
END REQUEST_TYPE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BATCH_JOB') != 0
THEN S.BTCJOBNAME ELSE MAP(BI.BATCH_JOB, '%', 'any', BI.BATCH_JOB)
END BATCH_JOB,
COUNT(*) NUM,
SUM(DB_ROWS) DB_ROWS,
SUM(DB_TIME_MS) DB_TIME_MS,
ORDER_BY
FROM
( SELECT
BEGIN_TIME,
END_TIME,
APP_SERVER,
MANDT,
WP_TYPE,
WP_ID,
CPID,
ACTION,
TABLE_NAME,
STATE,
WAITING_FOR,
APP_USER,
APP_SOURCE,
REQUEST_TYPE,
BATCH_JOB,
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 */
TO_TIMESTAMP('2017/07/11 06:15:00', 'YYYY/MM/DD HH24:MI:SS') BEGIN_TIME,
TO_TIMESTAMP('2017/07/11 06:18:00', 'YYYY/MM/DD HH24:MI:SS') END_TIME,
'%' APP_SERVER,
'%' MANDT,
'%' WP_TYPE,
-1 WP_ID,
-1 CPID,
'%' ACTION,
'%' TABLE_NAME,
'%' STATE,
'%' WAITING_FOR,
'%' APP_USER,
'%' APP_SOURCE,
'%' REQUEST_TYPE,
'%' BATCH_JOB,
'TIME, APP_USER, TABLE_NAME' AGGREGATE_BY, /* TIME, SERVER, MANDT,
WP_ID, WP_TYPE, CPID, ACTION, TABLE, WAITING, APP_USER, APP_SOURCE, REQUEST,
BATCH_JOB or comma separated combinations, NONE for no aggregation */
'TS60' TIME_AGGREGATE_BY, /* HOUR, DAY, HOUR_OF_DAY or database time
pattern, TS<seconds> for time slice, NONE for no aggregation */
'TIME' ORDER_BY /* TIME, SAMPLES */
FROM
DUMMY
)
) BI,
( SELECT
TO_TIMESTAMP(DATUM || TIME, 'YYYYMMDDHH24MISS') START_TIME,
SERVER,
TENANT,
WP_INDEX,
MAP(WP_TYPE, 1, 'DIA', 2, 'UPD', 3, 'ENQ', 4, 'BTC', 5, 'SPO', 6, 'UP2',
'UNDEF') WP_TYPE,
PID,
MAP(CURRENT_ACTION,
0, '',
1, 'ENQUEUE',
2, 'SAPGUI RESPONSE',
5, 'ROLL IN',
6, 'ROLL OUT',
10, 'SELECT (SINGLE)',
11, 'SELECT',
13, 'INSERT',
14, 'UPDATE',
15, 'DELETE',
16, 'COMMIT',
17, 'ABAP GENERATION',
18, 'ABAP LOAD',
19, 'CUA LOAD',
20, 'DYNPRO LOAD',
21, 'ROLLBACK',
22, 'OTHER DB ACTION',
45, 'ADMIN TASK',
'UNDEFINED (' || CURRENT_ACTION || ')'
) ACTION,
CASE WHEN CURRENT_ACTION BETWEEN 10 AND 15 THEN ACTION_INFO ELSE '' END
TABLE_NAME,
MAP(STATE_INFO,
0, '',
1, 'DEBUG',
2, 'SYNC RFC',
3, 'ENQUEUE',
4, 'UPDATE WAIT',
6, 'ADM WAIT',
7, 'NRRANGE WAIT',
8, 'SAPGUI WAIT',
9, 'PRIV MODE',
15, 'ABAP WAIT',
16, 'MSGSERVER',
19, 'ASYNC RFC',
'UNDEFINED (' || STATE_INFO || ')'
) STATE,
MAP(ROOTTYPE,
'R', 'RFC',
'U', 'HTTPS',
'S', 'Report',
'T', 'Transaction',
'B', 'Background',
ROOTTYPE) || MAP(ROOTNAME, '', '', CHAR(32) || '(' || ROOTNAME || ')')
REQUEST_TYPE,
WAIT_INFO ||
CASE WHEN WAIT_INFO != '' AND WAIT_FOR != '' THEN CHAR(32) || '/' ||
CHAR(32) ELSE '' END ||
WAIT_FOR WAITING_FOR,
USER_NAME,
MAIN_PROGRAM || MAP(WP_PROGRAM, MAIN_PROGRAM, '', CHAR(32) || '->' ||
CHAR(32) || WP_PROGRAM) APP_SOURCE,
BTCJOBNAME,
DBRECORDS + DBRECORDS_C DB_ROWS,
DBTIME + DBTIME_C DB_TIME_MS
FROM
"/SDF/SMON_WPINFO"
) S
WHERE
S.START_TIME BETWEEN BI.BEGIN_TIME AND BI.END_TIME AND
S.SERVER LIKE BI.APP_SERVER AND
S.TENANT LIKE BI.MANDT AND
( BI.WP_ID = -1 OR S.WP_INDEX = BI.WP_ID ) AND
S.WP_TYPE LIKE BI.WP_TYPE AND
( BI.CPID = -1 OR S.PID = BI.CPID ) AND
S.ACTION LIKE BI.ACTION AND
S.TABLE_NAME LIKE BI.TABLE_NAME AND
S.STATE LIKE BI.STATE AND
S.WAITING_FOR LIKE BI.WAITING_FOR AND
S.USER_NAME LIKE BI.APP_USER AND
S.APP_SOURCE LIKE BI.APP_SOURCE AND
S.REQUEST_TYPE LIKE BI.REQUEST_TYPE AND
S.BTCJOBNAME LIKE BI.BATCH_JOB
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'), S.START_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(S.START_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SERVER') != 0
THEN S.SERVER ELSE MAP(BI.APP_SERVER, '%', 'any', BI.APP_SERVER)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'MANDT') != 0
THEN S.TENANT ELSE MAP(BI.MANDT, '%', 'any', BI.MANDT)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_ID') != 0
THEN TO_VARCHAR(S.WP_INDEX) ELSE MAP(BI.WP_ID, -1, 'any',
TO_VARCHAR(BI.WP_ID)) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_TYPE') != 0
THEN S.WP_TYPE ELSE MAP(BI.WP_TYPE, '%', 'any', BI.WP_TYPE)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CPID') != 0
THEN TO_VARCHAR(S.PID) ELSE MAP(BI.CPID, -1, 'any',
TO_VARCHAR(BI.CPID)) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'ACTION') != 0
THEN S.ACTION ELSE MAP(BI.ACTION, '%', 'any', BI.ACTION)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TABLE') != 0
THEN S.TABLE_NAME ELSE MAP(BI.TABLE_NAME, '%', 'any', BI.TABLE_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATE') != 0
THEN S.STATE ELSE MAP(BI.STATE, '%', 'any', BI.STATE)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WAITING') != 0
THEN S.WAITING_FOR ELSE MAP(BI.WAITING_FOR, '%', 'any', BI.WAITING_FOR)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_USER') != 0
THEN S.USER_NAME ELSE MAP(BI.APP_USER, '%', 'any', BI.APP_USER)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_SOURCE') != 0
THEN S.APP_SOURCE ELSE MAP(BI.APP_SOURCE, '%', 'any', BI.APP_SOURCE)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'REQUEST') != 0
THEN S.REQUEST_TYPE ELSE MAP(BI.REQUEST_TYPE, '%', 'any', BI.REQUEST_TYPE)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'BATCH_JOB') != 0
THEN S.BTCJOBNAME ELSE MAP(BI.BATCH_JOB, '%', 'any', BI.BATCH_JOB)
END,
ORDER_BY
)
ORDER BY
MAP(ORDER_BY, 'SAMPLES', NUM) DESC,
MAP(ORDER_BY, 'TIME', START_TIME) DESC,
APP_SERVER,
WP_ID

You might also like