You are on page 1of 4

SELECT

/*

[NAME]

- HANA_Workload_1.00.90+_ESS_MDC

[DESCRIPTION]

- Workload information including number of SQL statements and transactions

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- HOST_WORKLOAD not available before SPS 7


- Has to be run in system database of an MDC system, otherwise it terminates with
error "[362]: invalid schema name: SYS_DATABASES"
- Multitenant database containers (MDC) are available starting with SAP HANA
1.00.90

[VALID FOR]

- Revisions: >= 1.00.90


- Statistics server type: ESS
- System type: MDC system database

[SQL COMMAND VERSION]

- 2014/04/28: 1.0 (initial version)


- 2014/12/19: 1.1 (AGGREGATE_BY included)
- 2015/03/17: 1.2 (dedicated version for SPS 6 and below)
- 2017/01/11: 1.3 (dedicated MDC version)
- 2017/10/27: 1.4 (TIMEZONE included)
- 2017/11/07: 1.5 (times removed)

[INVOLVED TABLES]

- SYS_DATABASES.M_WORKLOAD
- SYS_DATABASES.M_SERVICES

[INPUT PARAMETERS]

- HOST

Host name

'saphana01' --> Specic host saphana01


'saphana%' --> All hosts starting with saphana
'%' --> All hosts

- PORT

Port number

'30007' --> Port 30007


'%03' --> All ports ending with '03'
'%' --> No restriction to ports

- SERVICE_NAME

Service name

'indexserver' --> Specific service indexserver


'%server' --> All services ending with 'server'
'%' --> All services

- DB_NAME

Multitenant database name

'SYSTEMDB' --> System database


'C11' --> Tenant C11
'%' --> No restriction to multitenant database

- AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'HOST, PORT' --> Aggregation by host and port


'NONE' --> No aggregation

[OUTPUT PARAMETERS]

- HOST: Host name


- PORT: Port
- SERVICE: Service name
- DB_NAME: Database name
- EXEC_PER_S: Number of SQL statement executions per second
- PREP_PER_S: Number of prepares per second
- TRANS_PER_S: Number of transactions per second
- UPD_TRANS_PER_S: Number of update transactions per second
- COMMIT_PER_S: Number of commits per second
- ROLLBACK_PER_S: Number of rollbacks per second

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
-----------------------------
|SNAPSHOT_TIME |HOST |PORT |EXEC_PER_S|PREP_PER_S|TRANS_PER_S|
UPD_TRANS_PER_S|COMMIT_PER_S|ROLLBACK_PER_S|
-----------------------------------------------------------------------------------
-----------------------------
|2014/12/19 (FRI)|saphanadb| any| 15363.65| 103.94| 38.04|
37.73| 38.03| 0.01|
|2014/12/18 (THU)|saphanadb| any| 11145.88| 89.44| 26.25|
25.65| 26.22| 0.03|
|2014/12/17 (WED)|saphanadb| any| 14473.61| 122.74| 30.05|
26.85| 29.99| 0.06|
|2014/12/16 (TUE)|saphanadb| any| 12951.43| 94.15| 28.05|
26.88| 27.97| 0.08|
|2014/12/15 (MON)|saphanadb| any| 15908.58| 101.16| 25.51|
24.64| 25.46| 0.04|
|2014/12/14 (SUN)|saphanadb| any| 5007.65| 7.43| 17.08|
16.27| 17.06| 0.02|
|2014/12/13 (SAT)|saphanadb| any| 7502.89| 12.72| 18.58|
17.52| 18.55| 0.03|
-----------------------------------------------------------------------------------
-----------------------------

*/

HOST,
LPAD(PORT, 5) PORT,
SERVICE_NAME SERVICE,
DATABASE_NAME DB_NAME,
LPAD(TO_DECIMAL(CURRENT_EXECUTION_RATE / 60, 10, 2), 10) EXEC_PER_S,
LPAD(TO_DECIMAL(CURRENT_COMPILATION_RATE / 60, 10, 2), 10) PREP_PER_S,
LPAD(TO_DECIMAL(CURRENT_TRANSACTION_RATE / 60, 10, 2), 11) TRANS_PER_S,
LPAD(TO_DECIMAL(CURRENT_UPDATE_TRANSACTION_RATE / 60, 10, 2), 15)
UPD_TRANS_PER_S,
LPAD(TO_DECIMAL(CURRENT_COMMIT_RATE / 60, 10, 2), 12) COMMIT_PER_S,
LPAD(TO_DECIMAL(CURRENT_ROLLBACK_RATE / 60, 10, 2), 14) ROLLBACK_PER_S
FROM
( SELECT
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'HOST') != 0 THEN
HOST ELSE MAP(BI_HOST, '%', 'any', BI_HOST) END HOST,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'PORT') != 0 THEN
TO_VARCHAR(PORT) ELSE MAP(BI_PORT, '%', 'any', BI_PORT) END PORT,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'SERVICE') != 0 THEN
SERVICE_NAME ELSE MAP(BI_SERVICE_NAME, '%', 'any', BI_SERVICE_NAME) END
SERVICE_NAME,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'DB_NAME') != 0 THEN
DATABASE_NAME ELSE MAP(BI_DB_NAME, '%', 'any', BI_DB_NAME) END
DATABASE_NAME,
SUM(CURRENT_EXECUTION_RATE) CURRENT_EXECUTION_RATE,
SUM(CURRENT_COMPILATION_RATE) CURRENT_COMPILATION_RATE,
SUM(CURRENT_TRANSACTION_RATE) CURRENT_TRANSACTION_RATE,
SUM(CURRENT_UPDATE_TRANSACTION_RATE) CURRENT_UPDATE_TRANSACTION_RATE,
SUM(CURRENT_COMMIT_RATE) CURRENT_COMMIT_RATE,
SUM(CURRENT_ROLLBACK_RATE) CURRENT_ROLLBACK_RATE
FROM
( SELECT
W.HOST,
W.PORT,
S.SERVICE_NAME,
W.DATABASE_NAME,
AVG(W.CURRENT_EXECUTION_RATE) CURRENT_EXECUTION_RATE,
AVG(W.CURRENT_COMPILATION_RATE) CURRENT_COMPILATION_RATE,
AVG(W.CURRENT_TRANSACTION_RATE) CURRENT_TRANSACTION_RATE,
AVG(W.CURRENT_UPDATE_TRANSACTION_RATE) CURRENT_UPDATE_TRANSACTION_RATE,
AVG(W.CURRENT_COMMIT_RATE) CURRENT_COMMIT_RATE,
AVG(W.CURRENT_ROLLBACK_RATE) CURRENT_ROLLBACK_RATE,
BI.HOST BI_HOST,
BI.PORT BI_PORT,
BI.SERVICE_NAME BI_SERVICE_NAME,
BI.DB_NAME BI_DB_NAME,
BI.AGGREGATE_BY
FROM
( SELECT /* Modification section */
'%' HOST,
'%' PORT,
'%' SERVICE_NAME,
'%' DB_NAME,
'DB_NAME' AGGREGATE_BY /* HOST, PORT, SERVICE, DB_NAME or comma
separated combination, NONE for no aggregation */
FROM
DUMMY
) BI,
SYS_DATABASES.M_SERVICES S,
( SELECT
'CURRENT' DATA_SOURCE,
CURRENT_TIMESTAMP SAMPLE_TIME,
HOST,
PORT,
DATABASE_NAME,
CURRENT_EXECUTION_RATE,
CURRENT_COMPILATION_RATE,
CURRENT_TRANSACTION_RATE,
CURRENT_UPDATE_TRANSACTION_RATE,
CURRENT_COMMIT_RATE,
CURRENT_ROLLBACK_RATE
FROM
SYS_DATABASES.M_WORKLOAD
) W
WHERE
S.HOST LIKE BI.HOST AND
TO_VARCHAR(S.PORT) LIKE BI.PORT AND
S.SERVICE_NAME LIKE BI.SERVICE_NAME AND
S.DATABASE_NAME LIKE BI.DB_NAME AND
W.HOST = S.HOST AND
W.PORT = S.PORT AND
W.DATABASE_NAME = S.DATABASE_NAME
GROUP BY
W.HOST,
W.PORT,
S.SERVICE_NAME,
W.DATABASE_NAME,
BI.HOST,
BI.PORT,
BI.SERVICE_NAME,
BI.DB_NAME,
BI.AGGREGATE_BY
)
GROUP BY
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'HOST') != 0 THEN
HOST ELSE MAP(BI_HOST, '%', 'any', BI_HOST) END,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'PORT') != 0 THEN
TO_VARCHAR(PORT) ELSE MAP(BI_PORT, '%', 'any', BI_PORT) END,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'SERVICE') != 0 THEN
SERVICE_NAME ELSE MAP(BI_SERVICE_NAME, '%', 'any', BI_SERVICE_NAME) END,
CASE WHEN AGGREGATE_BY = 'NONE' OR INSTR(AGGREGATE_BY, 'DB_NAME') != 0 THEN
DATABASE_NAME ELSE MAP(BI_DB_NAME, '%', 'any', BI_DB_NAME) END
)
ORDER BY
HOST,
PORT,
DATABASE_NAME

You might also like