SELECT
/*
[NAME]
- HANA_Memory_Heap_Flags_2.00.060+
[DESCRIPTION]
- Heap allocator flag analysis
[SOURCE]
- SAP Note 1969700
[DETAILS AND RESTRICTIONS]
- SITE_ID in history tables available with SAP HANA >= 2.0 SPS 06
[VALID FOR]
- Revisions: >= 2.00.060
[SQL COMMAND VERSION]
- 2018/10/25: 1.0 (initial version)
- 2018/12/04: 1.1 (shortcuts for BEGIN_TIME and END_TIME like 'C', 'E-S900' or
'MAX')
- 2022/05/26: 1.2 (dedicated 2.00.060+ version including SITE_ID for data source
HISTORY)
[INVOLVED TABLES]
- HOST_HEAP_ALLOCATORS
- M_HEAP_MEMORY
[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)
- TIMEZONE
Used timezone (both for input and output parameters)
'SERVER' --> Display times in SAP HANA server time
'UTC' --> Display times in UTC time
- SITE_ID
System replication site ID (may only work for DATA_SOURCE = 'HISTORY')
-1 --> No restriction related to site ID
1 --> Site id 1
- 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
- ALLOCATOR_NAME
Heap allocator name
'Pool/Statistics' --> Filter for heap allocator Pool/Statistics
'%' --> No restriction related to heap allocator name
- FLAGS
Heap allocator flags
'astrace' --> Filter for allocator stack trace (astrace) flags
'%' --> No restriction related to heap allocator flags
- ONLY_TRACE_FLAGS
Possibility to restrict the output to heap allocators with activated trace flags
'X' --> Only display allocators with activated trace flags
' ' --> No restriction related to allocators with activated trace
flags
- DATA_SOURCE
Source of analysis data
'CURRENT' --> Data from memory information (M_ tables)
'HISTORY' --> Data from persisted history information (HOST_ tables)
- 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
[OUTPUT PARAMETERS]
- START_TIME: Start time
- ST: System replication site ID
- HOST: Host name
- PORT: Port
- ALLOCATOR_NAME: Heap allocator name
- FLAGS: Heap allocator flags
- COUNT: Number of heap allocators (1 if not aggregated)
[EXAMPLE OUTPUT]
------------------------------------------------------------------------------
|START_TIME |HOST |PORT |ALLOCATOR_NAME |FLAGS |COUNT|
------------------------------------------------------------------------------
|2018/10/25 11:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 10:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 09:00:00|saphanahost01|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 09:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 08:00:00|saphanahost01|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 08:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 07:00:00|saphanahost01|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 07:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 06:00:00|saphanahost01|30003|Pool/CalculationEngine|astrace| 1|
|2018/10/25 06:00:00|saphanahost05|30003|Pool/CalculationEngine|astrace| 1|
------------------------------------------------------------------------------
*/
START_TIME,
IFNULL(LPAD(SITE_ID, 2), '') ST,
HOST,
LPAD(PORT, 5) PORT,
ALLOCATOR_NAME,
FLAGS,
LPAD(COUNT, 5) COUNT
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'), CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(H.SERVER_TIMESTAMP, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE H.SERVER_TIMESTAMP END) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(H.SERVER_TIMESTAMP, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE H.SERVER_TIMESTAMP END, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SITE_ID') != 0
THEN TO_VARCHAR(H.SITE_ID) ELSE MAP(BI.SITE_ID, -1, 'any',
TO_VARCHAR(BI.SITE_ID)) END SITE_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HOST') != 0
THEN H.HOST ELSE MAP(BI.HOST, '%', 'any', BI.HOST)
END HOST,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'PORT') != 0
THEN TO_VARCHAR(H.PORT) ELSE MAP(BI.PORT, '%', 'any', BI.PORT)
END PORT,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'ALLOCATOR') != 0
THEN H.CATEGORY ELSE MAP(BI.ALLOCATOR_NAME, '%', 'any',
BI.ALLOCATOR_NAME) END ALLOCATOR_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'FLAGS') != 0
THEN H.FLAGS ELSE MAP(BI.FLAGS, '%', 'any', BI.FLAGS)
END FLAGS,
COUNT(DISTINCT(H.HOST || H.PORT || H.CATEGORY)) COUNT
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,
TIMEZONE,
SITE_ID,
HOST,
PORT,
ALLOCATOR_NAME,
FLAGS,
ONLY_TRACE_FLAGS,
DATA_SOURCE,
AGGREGATE_BY,
TIME_AGGREGATE_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 */
'SERVER' TIMEZONE, /* SERVER, UTC */
-1 SITE_ID,
'%' HOST,
'%' PORT,
'%' ALLOCATOR_NAME,
'%' FLAGS,
'X' ONLY_TRACE_FLAGS,
'CURRENT' DATA_SOURCE,
'FLAGS' AGGREGATE_BY, /* SITE_ID, HOST, PORT, ALLOCATOR, FLAGS, TIME
or comma separated combinations, NONE for no aggregation */
'TS3600' TIME_AGGREGATE_BY /* HOUR, DAY, HOUR_OF_DAY or database time
pattern, TS<seconds> for time slice, NONE for no aggregation */
FROM
DUMMY
)
) BI,
( SELECT
'CURRENT' DATA_SOURCE,
CURRENT_TIMESTAMP SERVER_TIMESTAMP,
CURRENT_SITE_ID() SITE_ID,
HOST,
PORT,
CATEGORY,
FLAGS
FROM
M_HEAP_MEMORY
UNION ALL
SELECT
'HISTORY' DATA_SOURCE,
SERVER_TIMESTAMP,
SITE_ID,
HOST,
PORT,
CATEGORY,
FLAGS
FROM
_SYS_STATISTICS.HOST_HEAP_ALLOCATORS
) H
WHERE
( BI.DATA_SOURCE = 'CURRENT' OR
CASE BI.TIMEZONE WHEN 'UTC' THEN ADD_SECONDS(H.SERVER_TIMESTAMP,
SECONDS_BETWEEN(CURRENT_TIMESTAMP, CURRENT_UTCTIMESTAMP)) ELSE H.SERVER_TIMESTAMP
END BETWEEN BI.BEGIN_TIME AND BI.END_TIME
) AND
( BI.SITE_ID = -1 OR ( BI.SITE_ID = 0 AND H.SITE_ID IN (-1, 0) ) OR H.SITE_ID =
BI.SITE_ID ) AND
H.HOST LIKE BI.HOST AND
TO_VARCHAR(H.PORT) LIKE BI.PORT AND
H.CATEGORY LIKE BI.ALLOCATOR_NAME AND
H.FLAGS LIKE BI.FLAGS AND
H.DATA_SOURCE LIKE BI.DATA_SOURCE AND
( BI.ONLY_TRACE_FLAGS = ' ' OR H.FLAGS NOT IN ( '(none)', 'preventcheck',
'nonemptyok') )
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'), CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(H.SERVER_TIMESTAMP, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE H.SERVER_TIMESTAMP END) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(CASE BI.TIMEZONE WHEN 'UTC' THEN
ADD_SECONDS(H.SERVER_TIMESTAMP, SECONDS_BETWEEN(CURRENT_TIMESTAMP,
CURRENT_UTCTIMESTAMP)) ELSE H.SERVER_TIMESTAMP END, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SITE_ID') != 0
THEN TO_VARCHAR(H.SITE_ID) ELSE MAP(BI.SITE_ID, -1, 'any',
TO_VARCHAR(BI.SITE_ID)) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HOST') != 0
THEN H.HOST ELSE MAP(BI.HOST, '%', 'any', BI.HOST)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'PORT') != 0
THEN TO_VARCHAR(H.PORT) ELSE MAP(BI.PORT, '%', 'any', BI.PORT)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'ALLOCATOR') != 0
THEN H.CATEGORY ELSE MAP(BI.ALLOCATOR_NAME, '%', 'any',
BI.ALLOCATOR_NAME) END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'FLAGS') != 0
THEN H.FLAGS ELSE MAP(BI.FLAGS, '%', 'any', BI.FLAGS)
END
)
ORDER BY
START_TIME DESC,
SITE_ID,
HOST,
PORT,
ALLOCATOR_NAME