HANA Threads CurrentThreads 2.00.040+
HANA Threads CurrentThreads 2.00.040+
/*
[NAME]
- HANA_Threads_CurrentThreads_2.00.040+
[DESCRIPTION]
- Thread information
[SOURCE]
[VALID FOR]
[INVOLVED TABLES]
- GLOBAL_TABLE_PERSISTENCE_STATISTICS
- HOST_SQL_PLAN_CACHE
- M_ACTIVE_STATEMENTS
- M_CONNECTIONS
- M_SERVICE_THREADS
- M_SQL_PLAN_CACHE
[INPUT PARAMETERS]
- HOST
Host name
- PORT
Port number
- SERVICE_NAME
Service name
- ONLY_ACTIVE_THREADS
- CONN_ID
Connection ID
- LOG_CONN_ID:
Logical connection ID
- PAR_CONN_ID
Parent connection ID
- CLIENT_IP
IP address of client
- CLIENT_PID
Client process ID
- DB_USER
Database user
- APP_NAME
Name of application
- APP_USER
Application user
- APP_SOURCE
Application source
- THREAD_ID
Thread identifier
Transaction ID
- THREAD_TYPE
- THREAD_STATE
- THREAD_METHOD
Thread method
- THREAD_DETAIL
Thread detail
- LOCK_NAME
Lock name
- NUMA_NODE
Numa node
- STATEMENT_HASH
- ROOT_STATEMENT_HASH
Root statement hash (e.g. hash of procedure responsible for statement execution)
- PASSPORT_COMPONENT
Passport component
- PASSPORT_ACTION
Passport action
- TABLE_NAME
- EXCLUDE_PHANTOM_THREADS
Possibility to exclude idle threads that are shown as "active" due to SAP HANA
bugs
'X' --> Do not show idle threads that are shown as active threads
' ' --> No restriction of displayed threads
- EXCLUDE_CURRENT_CONN_ID
- AGGREGATION_TYPE
- AGGREGATE_BY
[OUTPUT PARAMETERS]
[EXAMPLE OUTPUT]
-----------------------------------------------------------------------------------
----------------------------------------------
|HOST |SERVICE_NAME |NUM |CONN_ID |THREAD_ID|THREAD_TYPE |
THREAD_STATE|ACTIVE|APP_USER |DURATION_S|CPU_TIME_S|
-----------------------------------------------------------------------------------
----------------------------------------------
|saphana20|preprocessor | 1| 338803| 24424|Request |any
|TRUE |ZSAP_10 | 0.00| 0.00|
|saphana20|indexserver | 1| 338803| 24449|Request |any
|TRUE |ZSAP_10 | 0.00| 0.00|
|saphana20|nameserver | 1| 338803| 28364|Request |any
|TRUE |ZSAP_10 | 0.00| 0.00|
|saphana21|indexserver | 1| 338803| 52999|SqlExecutor |any
|TRUE |ZSAP_10 | 0.03| 0.00|
|saphana21|indexserver | 1| 300257| 53005|SqlExecutor |any
|TRUE |RT_VENTES | 0.00| 0.00|
|saphana21|indexserver | 1| 301432| 53011|SqlExecutor |any
|TRUE |RT_LOG | 0.00| 0.00|
|saphana21|indexserver | 1| 301551| 53024|SqlExecutor |any
|TRUE |RT_VENTES | 0.00| 0.00|
|saphana21|indexserver | 1| 300290| 53508|SqlExecutor |any
|TRUE |RT_PUSHW045| 0.00| 0.00|
|saphana21|indexserver | 1| 300776| 65701|SqlExecutor |any
|TRUE |RT_PUSHW045| 0.00| 0.00|
|saphana20|compileserver | 1| 338803| 93615|Request |any
|TRUE |ZSAP_10 | 0.00| 0.00|
|saphana21|nameserver | 1| 338803| 102512|Request |any
|TRUE |ZSAP_10 | 0.00| 0.00|
-----------------------------------------------------------------------------------
----------------------------------------------
*/
BASIS_INFO AS
( SELECT /* Modification section */
'%' HOST,
'%' PORT,
'%' SERVICE_NAME,
-1 CONN_ID,
-1 LOG_CONN_ID,
-1 PAR_CONN_ID,
'%' JOB_QUEUEING,
'%' CLIENT_IP,
-1 CLIENT_PID,
'%' DB_USER,
'%' APP_NAME,
'%' APP_USER,
'%' APP_SOURCE,
-1 THREAD_ID,
-1 TRANS_ID,
'%' THREAD_TYPE,
'%' THREAD_STATE,
'%' THREAD_METHOD,
'%' THREAD_DETAIL,
'%' LOCK_NAME,
-1 NUMA_NODE,
'%' STATEMENT_HASH,
'%' ROOT_STATEMENT_HASH,
'%' PASSPORT_COMPONENT,
'%' PASSPORT_ACTION,
'%' TABLE_NAME,
'X' ONLY_ACTIVE_THREADS,
'X' EXCLUDE_PHANTOM_THREADS,
'X' EXCLUDE_CURRENT_CONN_ID,
'SUM' AGGREGATION_TYPE, /* MAX, AVG, SUM */
'NONE' AGGREGATE_BY, /* HOST, PORT, SERVICE, CONN_ID, LOG_CONN,
PAR_CONN, CLIENT_PID, HASH, DB_USER, APP_NAME, APP_USER, APP_SOURCE, THREAD_TYPE,
THREAD_STATE, THREAD_METHOD, THREAD_DETAIL,
THREAD_ID, CALLER, CALLING, LOCK_NAME, LOCKS_OWNED, NUMA_NODE, QUEUEING,
TRANS_ID, PASSPORT_COMPONENT, PASSPORT_ACTION and comma separated combinations,
NONE for no aggregation */
'CONNECTION' ORDER_BY /* THREAD_ID, CONNECTION, THREADS, MEMORY,
DURATION */
FROM
DUMMY
),
THREADS_HELPER AS
( SELECT
HOST,
TO_VARCHAR(PORT) PORT,
CONNECTION_ID CONN_ID,
STATEMENT_HASH,
ROOT_STATEMENT_HASH,
STATEMENT_ID,
THREAD_ID,
THREAD_TYPE,
THREAD_STATE,
THREAD_METHOD,
TO_VARCHAR(SUBSTR(THREAD_DETAIL, 1, 5000)) THREAD_DETAIL,
CLIENT_IP,
CLIENT_PID,
CALLER,
CASE
WHEN CALLER LIKE '%@%:%' THEN SUBSTR(CALLER, 1, LOCATE(CALLER, '@') - 1)
WHEN CALLER LIKE '%:%' THEN '-99'
ELSE MAP(CALLER, '', '-99', CALLER)
END CALLER_THREAD,
CASE WHEN CALLER LIKE '%:%' THEN SUBSTR(CALLER, LOCATE(CALLER, '@') + 1,
LOCATE(CALLER, ':') - LOCATE(CALLER, '@') - 1) ELSE HOST
END CALLER_HOST,
CASE WHEN CALLER LIKE '%:%' THEN SUBSTR(CALLER, LOCATE(CALLER, ':') + 1)
ELSE TO_VARCHAR(PORT) END CALLER_PORT,
CALLING,
IS_ACTIVE ACTIVE,
USER_NAME DB_USER,
APPLICATION_NAME APP_NAME,
APPLICATION_USER_NAME APP_USER,
APPLICATION_SOURCE APP_SOURCE,
DURATION DURATION_MS,
CPU_TIME_SELF CPU_TIME_US,
LOCK_OWNER_THREAD_ID BLK_THREAD,
LOCK_WAIT_NAME LOCK_NAME,
LOCKS_OWNED,
IFNULL(NUMA_NODE_INDEX, -2) NUMA_NODE,
TRANSACTION_ID TRANS_ID,
IFNULL(PASSPORT_ACTION, '') PASSPORT_ACTION,
IFNULL(PASSPORT_COMPONENT_NAME, '') PASSPORT_COMPONENT
FROM
M_SERVICE_THREADS
),
THREADS AS
( SELECT
T1.HOST,
T1.PORT,
CASE WHEN T1.CONN_ID = -1 AND T2.CONN_ID IS NOT NULL THEN T2.CONN_ID ELSE
T1.CONN_ID END CONN_ID,
T1.STATEMENT_HASH,
T1.ROOT_STATEMENT_HASH,
T1.STATEMENT_ID,
T1.THREAD_ID,
T1.THREAD_TYPE,
T1.THREAD_STATE,
T1.THREAD_METHOD,
T1.THREAD_DETAIL,
T1.CLIENT_IP,
T1.CLIENT_PID,
T1.CALLER,
T1.CALLING,
T1.ACTIVE,
T1.DB_USER,
T1.APP_NAME,
T1.APP_USER,
T1.APP_SOURCE,
T1.DURATION_MS,
T1.CPU_TIME_US,
T1.BLK_THREAD,
T1.LOCK_NAME,
T1.LOCKS_OWNED,
T1.NUMA_NODE,
T1.TRANS_ID,
T1.PASSPORT_ACTION,
T1.PASSPORT_COMPONENT,
CASE WHEN T1.THREAD_STATE = 'Job Exec Waiting' AND T1.CALLING = '' THEN 'X'
ELSE '' END JOB_QUEUEING,
CASE
WHEN T1.CALLER = '' THEN 0
WHEN T3.THREAD_ID IS NULL THEN 1
WHEN T4.THREAD_ID IS NULL THEN 2
ELSE 3
END LVL,
CASE
WHEN T1.CALLER = '' THEN LPAD(IFNULL(T1.THREAD_ID, 0), 15, '-') ||
LPAD('-', 45, '-')
WHEN T3.THREAD_ID IS NULL THEN LPAD(IFNULL(T2.THREAD_ID, 0), 15, '-') ||
LPAD(IFNULL(T1.THREAD_ID, 0), 15, '-') || LPAD('-', 30, '-')
WHEN T4.THREAD_ID IS NULL THEN LPAD(IFNULL(T3.THREAD_ID, 0), 15, '-') ||
LPAD(IFNULL(T2.THREAD_ID, 0), 15, '-') || LPAD(IFNULL(T1.THREAD_ID, 0), 15, '-') ||
LPAD('-', 15, '-')
ELSE LPAD(IFNULL(T4.THREAD_ID, 0), 15, '-') ||
LPAD(IFNULL(T3.THREAD_ID, 0), 15, '-') || LPAD(IFNULL(T2.THREAD_ID, 0), 15, '-') ||
LPAD(IFNULL(T1.THREAD_ID, 0), 15, '-')
END CONN_HIERARCHY
FROM
THREADS_HELPER T1 LEFT OUTER JOIN
THREADS_HELPER T2 ON
T2.THREAD_ID = T1.CALLER_THREAD AND
T2.HOST = T1.CALLER_HOST AND
T2.PORT = T1.CALLER_PORT LEFT OUTER JOIN
THREADS_HELPER T3 ON
T3.THREAD_ID = T2.CALLER_THREAD AND
T3.HOST = T2.CALLER_HOST AND
T3.PORT = T2.CALLER_PORT LEFT OUTER JOIN
THREADS_HELPER T4 ON
T4.THREAD_ID = T3.CALLER_THREAD AND
T4.HOST = T3.CALLER_HOST AND
T4.PORT = T3.CALLER_PORT
),
HASH_TABLE_MAPPING AS
( SELECT
S.STATEMENT_HASH,
S.SCHEMA_NAME,
S.TABLE_NAME,
IFNULL(T.TABLE_SIZE, 0) DISK_BYTE,
ROW_NUMBER () OVER (PARTITION BY S.STATEMENT_HASH ORDER BY T.TABLE_SIZE DESC,
S.SCHEMA_NAME, S.TABLE_NAME) SIZE_POS
FROM
( SELECT
STATEMENT_HASH,
CNT, LOCATE(ATN, '.', 1, CNT), LOCATE(ATN, '(', 1, CNT), LOCATE(ATN, ', ', 1,
CNT),
CASE CNT
WHEN 1 THEN SUBSTR(ATN, 1, LOCATE(ATN, '.', 1, CNT) - 1)
ELSE SUBSTR(ATN, LOCATE(ATN, ', ', 1, CNT - 1) + 2, LOCATE(ATN, '.', 1,
CNT) - LOCATE(ATN, ', ', 1, CNT - 1) - 2)
END SCHEMA_NAME,
SUBSTR(ATN, LOCATE(ATN, '.', 1, CNT) + 1, LOCATE(ATN, '(', 1, CNT) -
LOCATE(ATN, '.', 1, CNT) - 1) TABLE_NAME,
ATN
FROM
( SELECT TOP 2 ROW_NUMBER() OVER () CNT FROM OBJECTS ) C,
( SELECT DISTINCT
STATEMENT_HASH,
TO_VARCHAR(ACCESSED_TABLE_NAMES) ATN
FROM
M_SQL_PLAN_CACHE
WHERE
TO_VARCHAR(ACCESSED_TABLE_NAMES) != ''
UNION ALL
SELECT DISTINCT
STATEMENT_HASH,
TO_VARCHAR(ACCESSED_TABLE_NAMES) ATN
FROM
_SYS_STATISTICS.HOST_SQL_PLAN_CACHE
WHERE
TO_VARCHAR(ACCESSED_TABLE_NAMES) != ''
) S
WHERE
SUBSTR(ATN, LOCATE(ATN, '.', 1, CNT) + 1, LOCATE(ATN, '(', 1, CNT) -
LOCATE(ATN, '.', 1, CNT) - 1) != ''
) S LEFT OUTER JOIN
( SELECT
T.SCHEMA_NAME,
T.TABLE_NAME,
T.DISK_SIZE TABLE_SIZE
FROM
( SELECT MAX(SERVER_TIMESTAMP) MAX_SERVER_TIMESTAMP FROM
_SYS_STATISTICS.GLOBAL_TABLE_PERSISTENCE_STATISTICS ) TS,
_SYS_STATISTICS.GLOBAL_TABLE_PERSISTENCE_STATISTICS T
WHERE
T.SERVER_TIMESTAMP = TS.MAX_SERVER_TIMESTAMP
) T ON
S.SCHEMA_NAME = T.SCHEMA_NAME AND
S.TABLE_NAME = T.TABLE_NAME
)
SELECT
HOST,
LPAD(NUMA_NODE, 2) NM,
LPAD(PORT, 5) PORT,
LPAD(TO_DECIMAL(DURATION_S, 10, 2), 10) DURATION_S,
LPAD(CONN_ID, 9) CONN_ID,
LPAD(THREAD_ID, 9) THREAD_ID,
TABLE_NAME,
LPAD(CHAR(32), LVL * 2) || THREAD_TYPE THREAD_TYPE,
THREAD_METHOD,
THREAD_STATE,
JOB_QUEUEING Q,
LOCK_NAME,
STATEMENT_HASH,
REPLACE(REPLACE(REPLACE(THREAD_DETAIL, CHAR(9), ' '), CHAR(10), ' '), CHAR(13), '
') THREAD_DETAIL,
DB_USER,
APP_NAME,
APP_USER,
APP_SOURCE,
PASSPORT_COMPONENT,
PASSPORT_ACTION,
CLIENT_IP,
LPAD(CLIENT_PID, 10) CLIENT_PID,
LPAD(MAP(BLK_THREAD, '0', '', BLK_THREAD), 10) BLK_THREAD,
LOCKS_OWNED,
CALLER,
CALLING,
ACTIVE,
LPAD(TO_DECIMAL(CPU_TIME_S, 10, 2), 10) CPU_TIME_S,
MEM_USED_MB,
ROOT_STATEMENT_HASH,
LPAD(TRANS_ID, 8) TRANS_ID,
LPAD(NUM, 3) CNT
/* SERVICE_NAME SERVICE, IFNULL(LPAD(LOG_CONN_ID, 11), '') LOG_CONN_ID,
IFNULL(LPAD(PAR_CONN_ID, 11), '') PAR_CONN_ID,
REPLACE(REPLACE(REPLACE(IFNULL(SQL_TEXT, ''), CHAR(10), CHAR(32)), CHAR(13),
CHAR(32)), CHAR(9), CHAR(32)) SQL_TEXT */
FROM
( SELECT
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HOST')
!= 0 THEN T.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(T.PORT) ELSE MAP(BI.PORT, '%', 'any',
BI.PORT) END PORT,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'SERVICE')
!= 0 THEN S.SERVICE_NAME ELSE MAP(BI.SERVICE_NAME, '%',
'any', BI.SERVICE_NAME) END SERVICE_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CONN_ID')
!= 0 THEN TO_VARCHAR(T.CONN_ID) ELSE MAP(BI.CONN_ID, -1, 'any',
TO_VARCHAR(BI.CONN_ID)) END CONN_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'LOG_CONN')
!= 0 THEN TO_VARCHAR(C.LOGICAL_CONNECTION_ID) ELSE MAP(BI.LOG_CONN_ID, -1, 'any',
TO_VARCHAR(BI.LOG_CONN_ID)) END LOG_CONN_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'PAR_CONN')
!= 0 THEN TO_VARCHAR(C.PARENT_CONNECTION_ID) ELSE MAP(BI.PAR_CONN_ID, -1, 'any',
TO_VARCHAR(BI.PAR_CONN_ID)) END PAR_CONN_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'QUEUEING')
!= 0 THEN TO_VARCHAR(T.JOB_QUEUEING) ELSE MAP(BI.JOB_QUEUEING, '%',
'any', BI.JOB_QUEUEING) END JOB_QUEUEING,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HASH')
!= 0 THEN T.STATEMENT_HASH ELSE MAP(BI.STATEMENT_HASH, '%',
'any', BI.STATEMENT_HASH) END STATEMENT_HASH,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'ROOT')
!= 0 THEN T.ROOT_STATEMENT_HASH ELSE MAP(BI.ROOT_STATEMENT_HASH,
'%', 'any', BI.ROOT_STATEMENT_HASH) END ROOT_STATEMENT_HASH,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'HASH')
!= 0 THEN SUBSTR(ST.STATEMENT_STRING, 1, 4000) ELSE 'any'
END SQL_TEXT,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'DB_USER')
!= 0 THEN T.DB_USER ELSE MAP(BI.DB_USER, '%', 'any',
BI.DB_USER) END DB_USER,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_NAME')
!= 0 THEN T.APP_NAME ELSE MAP(BI.APP_NAME, '%', 'any',
BI.APP_NAME) END APP_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'APP_USER')
!= 0 THEN T.APP_USER 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 T.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, 'THREAD_TYPE')
!= 0 THEN T.THREAD_TYPE ELSE 'any'
END THREAD_TYPE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'THREAD_STATE')
!= 0 THEN T.THREAD_STATE ELSE 'any'
END THREAD_STATE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'THREAD_METHOD')
!= 0 THEN T.THREAD_METHOD ELSE 'any'
END THREAD_METHOD,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'THREAD_DETAIL')
!= 0 THEN T.THREAD_DETAIL ELSE 'any'
END THREAD_DETAIL,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'THREAD_ID')
!= 0 THEN TO_VARCHAR(T.THREAD_ID) ELSE 'any'
END THREAD_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TRANS_ID')
!= 0 THEN TO_VARCHAR(T.TRANS_ID) ELSE MAP(BI.TRANS_ID, -1, 'any',
TO_VARCHAR(BI.TRANS_ID)) END TRANS_ID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CLIENT_IP')
!= 0 THEN T.CLIENT_IP ELSE MAP(BI.CLIENT_IP, '%', 'any',
BI.CLIENT_IP) END CLIENT_IP,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CLIENT_PID')
!= 0 THEN TO_VARCHAR(T.CLIENT_PID) ELSE MAP(BI.CLIENT_PID, -1, 'any',
TO_VARCHAR(BI.CLIENT_PID)) END CLIENT_PID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CALLER')
!= 0 THEN T.CALLER ELSE 'any'
END CALLER,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'CALLING')
!= 0 THEN T.CALLING ELSE 'any'
END CALLING,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'LOCK_NAME')
!= 0 THEN T.LOCK_NAME ELSE 'any'
END LOCK_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'LOCKS_OWNED')
!= 0 THEN T.LOCKS_OWNED ELSE 'any'
END LOCKS_OWNED,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'NUMA_NODE')
!= 0 THEN TO_VARCHAR(T.NUMA_NODE) ELSE MAP(BI.NUMA_NODE, -1, 'any',
TO_VARCHAR(BI.NUMA_NODE)) END NUMA_NODE,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'PASSPORT_ACTION')
!= 0 THEN T.PASSPORT_ACTION ELSE MAP(BI.PASSPORT_ACTION, '%',
'any', BI.PASSPORT_ACTION) END PASSPORT_ACTION,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY,
'PASSPORT_COMPONENT') != 0 THEN T.PASSPORT_COMPONENT ELSE
MAP(BI.PASSPORT_COMPONENT, '%', 'any', BI.PASSPORT_COMPONENT) END
PASSPORT_COMPONENT,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TABLE')
!= 0 OR INSTR(BI.AGGREGATE_BY, 'HASH') != 0