master
go 1,042 lines 38.8 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build cgo
4
5 package db2
6
7 const (
8 // Edition detection queries - each targets specific edition characteristics
9 queryDetectVersionLUW = `SELECT SERVICE_LEVEL FROM SYSIBMADM.ENV_INST_INFO`
10 queryDetectVersionI = `SELECT 'DB2 for i' FROM SYSIBM.SYSDUMMY1 WHERE EXISTS (SELECT 1 FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA = 'QSYS2' FETCH FIRST 1 ROW ONLY)`
11 queryDetectVersionZOS = `SELECT VERSION FROM SYSIBM.SYSVERSIONS WHERE VERSION_TYPE = 'DB2'`
12
13 queryLockMetrics = `
14 SELECT
15 LOCK_WAITS,
16 LOCK_TIMEOUTS,
17 DEADLOCKS,
18 LOCK_ESCALS,
19 LOCKS_HELD as LOCK_ACTIVE,
20 LOCK_WAIT_TIME,
21 LOCKS_WAITING as LOCK_WAITING_AGENTS,
22 LOCK_LIST_IN_USE as LOCK_MEMORY_PAGES,
23 TOTAL_SORTS,
24 SORT_OVERFLOWS,
25 ROWS_READ,
26 ROWS_MODIFIED,
27 ROWS_SELECTED as ROWS_RETURNED
28 FROM SYSIBMADM.SNAPDB
29 `
30
31 queryBufferpoolAggregateMetrics = `
32 SELECT
33 -- Raw counter values for proper time-series hit ratio calculation
34 -- We need to subtract async pages as per IBM formula
35 SUM(POOL_DATA_LBP_PAGES_FOUND - POOL_ASYNC_DATA_LBP_PAGES_FOUND) as DATA_PAGES_FOUND,
36 SUM(POOL_INDEX_LBP_PAGES_FOUND - POOL_ASYNC_INDEX_LBP_PAGES_FOUND) as INDEX_PAGES_FOUND,
37 SUM(POOL_XDA_LBP_PAGES_FOUND - POOL_ASYNC_XDA_LBP_PAGES_FOUND) as XDA_PAGES_FOUND,
38 SUM(POOL_COL_LBP_PAGES_FOUND - POOL_ASYNC_COL_LBP_PAGES_FOUND) as COL_PAGES_FOUND,
39 SUM(POOL_DATA_L_READS) as DATA_L_READS,
40 SUM(POOL_INDEX_L_READS) as INDEX_L_READS,
41 SUM(POOL_XDA_L_READS) as XDA_L_READS,
42 SUM(POOL_COL_L_READS) as COL_L_READS,
43 SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS) as LOGICAL_READS,
44 SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) as PHYSICAL_READS,
45 SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS +
46 POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) as TOTAL_READS,
47 -- Detailed read metrics
48 SUM(POOL_DATA_L_READS) as DATA_LOGICAL_READS,
49 SUM(POOL_DATA_P_READS) as DATA_PHYSICAL_READS,
50 SUM(POOL_DATA_L_READS + POOL_DATA_P_READS) as DATA_TOTAL_READS,
51 SUM(POOL_INDEX_L_READS) as INDEX_LOGICAL_READS,
52 SUM(POOL_INDEX_P_READS) as INDEX_PHYSICAL_READS,
53 SUM(POOL_INDEX_L_READS + POOL_INDEX_P_READS) as INDEX_TOTAL_READS,
54 SUM(POOL_XDA_L_READS) as XDA_LOGICAL_READS,
55 SUM(POOL_XDA_P_READS) as XDA_PHYSICAL_READS,
56 SUM(POOL_XDA_L_READS + POOL_XDA_P_READS) as XDA_TOTAL_READS,
57 SUM(POOL_COL_L_READS) as COLUMN_LOGICAL_READS,
58 SUM(POOL_COL_P_READS) as COLUMN_PHYSICAL_READS,
59 SUM(POOL_COL_L_READS + POOL_COL_P_READS) as COLUMN_TOTAL_READS
60 FROM SYSIBMADM.SNAPBP
61 `
62
63 queryLogSpaceMetrics = `
64 SELECT
65 TOTAL_LOG_USED,
66 TOTAL_LOG_AVAILABLE,
67 CASE
68 WHEN (TOTAL_LOG_USED + TOTAL_LOG_AVAILABLE) > 0
69 THEN (TOTAL_LOG_USED * 100) / (TOTAL_LOG_USED + TOTAL_LOG_AVAILABLE)
70 ELSE 0
71 END as LOG_UTILIZATION,
72 (SELECT SUM(LOG_READS) FROM SYSIBMADM.SNAPDB) as LOG_READS,
73 (SELECT SUM(LOG_WRITES) FROM SYSIBMADM.SNAPDB) as LOG_WRITES
74 FROM SYSIBMADM.LOG_UTILIZATION
75 `
76
77 queryLongRunningQueries = `
78 SELECT
79 COUNT(*) as TOTAL_COUNT,
80 SUM(CASE WHEN ELAPSED_TIME_MIN >= 5 AND ELAPSED_TIME_MIN < 15 THEN 1 ELSE 0 END) as WARNING_COUNT,
81 SUM(CASE WHEN ELAPSED_TIME_MIN >= 15 THEN 1 ELSE 0 END) as CRITICAL_COUNT
82 FROM SYSIBMADM.LONG_RUNNING_SQL
83 WHERE ELAPSED_TIME_MIN > 0
84 `
85
86 queryBackupStatus = `
87 SELECT
88 OPERATION,
89 START_TIME,
90 OPERATIONTYPE,
91 SQLCODE
92 FROM SYSIBMADM.DB_HISTORY
93 WHERE OPERATION = 'B'
94 AND START_TIME >= CURRENT TIMESTAMP - %d DAYS
95 ORDER BY START_TIME DESC
96 FETCH FIRST 10 ROWS ONLY
97 `
98 queryBackupStatusSimple = `
99 SELECT
100 MAX(START_TIME) as LAST_BACKUP
101 FROM SYSIBMADM.DB_HISTORY
102 WHERE OPERATION = 'B' AND SQLCODE = 0
103 `
104
105 queryDatabaseInstances = `
106 SELECT
107 DB_NAME,
108 DB_STATUS,
109 APPLS_CUR_CONS
110 FROM SYSIBMADM.SNAPDB
111 `
112
113 queryBufferpoolInstances = `
114 SELECT
115 BP_NAME,
116 PAGESIZE,
117 NPAGES as TOTAL_PAGES,
118 NPAGES - FREE_PAGES as USED_PAGES,
119 -- Raw counters for hit/miss calculation
120 POOL_DATA_LBP_PAGES_FOUND - POOL_ASYNC_DATA_LBP_PAGES_FOUND as DATA_PAGES_FOUND,
121 POOL_INDEX_LBP_PAGES_FOUND - POOL_ASYNC_INDEX_LBP_PAGES_FOUND as INDEX_PAGES_FOUND,
122 POOL_XDA_LBP_PAGES_FOUND - POOL_ASYNC_XDA_LBP_PAGES_FOUND as XDA_PAGES_FOUND,
123 POOL_COL_LBP_PAGES_FOUND - POOL_ASYNC_COL_LBP_PAGES_FOUND as COL_PAGES_FOUND,
124 -- Read metrics
125 POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS as LOGICAL_READS,
126 POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS as PHYSICAL_READS,
127 POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS +
128 POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS as TOTAL_READS,
129 POOL_DATA_L_READS as DATA_LOGICAL_READS,
130 POOL_DATA_P_READS as DATA_PHYSICAL_READS,
131 POOL_INDEX_L_READS as INDEX_LOGICAL_READS,
132 POOL_INDEX_P_READS as INDEX_PHYSICAL_READS,
133 POOL_XDA_L_READS as XDA_LOGICAL_READS,
134 POOL_XDA_P_READS as XDA_PHYSICAL_READS,
135 POOL_COL_L_READS as COLUMN_LOGICAL_READS,
136 POOL_COL_P_READS as COLUMN_PHYSICAL_READS,
137 -- Write metrics
138 POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS as WRITES
139 FROM SYSIBMADM.SNAPBP
140 `
141
142 queryTablespaceInstances = `
143 SELECT
144 TBSP_NAME,
145 TBSP_TYPE,
146 TBSP_CONTENT_TYPE,
147 TBSP_STATE,
148 TBSP_TOTAL_SIZE_KB * 1024 as TOTAL_SIZE,
149 TBSP_USED_SIZE_KB * 1024 as USED_SIZE,
150 TBSP_FREE_SIZE_KB * 1024 as FREE_SIZE,
151 TBSP_USABLE_SIZE_KB * 1024 as USABLE_SIZE,
152 CASE
153 WHEN TBSP_TOTAL_SIZE_KB > 0
154 THEN (TBSP_USED_SIZE_KB * 100) / TBSP_TOTAL_SIZE_KB
155 ELSE 0
156 END as USED_PERCENT,
157 TBSP_PAGE_SIZE
158 FROM SYSIBMADM.TBSP_UTILIZATION
159 WHERE TBSP_TYPE = 'DMS'
160 `
161
162 queryConnectionInstances = `
163 SELECT
164 APPLICATION_ID,
165 APPLICATION_NAME,
166 CLIENT_HOSTNAME,
167 SESSION_AUTH_ID,
168 APPL_STATUS,
169 UOW_COMP_STATUS,
170 ROWS_READ,
171 ROWS_WRITTEN,
172 TOTAL_CPU_TIME
173 FROM SYSIBMADM.APPLICATIONS
174 WHERE APPL_STATUS IN ('CONNECTED', 'UOWEXEC')
175 `
176
177 // Table metrics using MON_GET_TABLE
178 queryTableInstances = `
179 SELECT
180 T.TABSCHEMA,
181 T.TABNAME,
182 T.DATA_OBJECT_L_PAGES as DATA_OBJECT_P_SIZE,
183 T.INDEX_OBJECT_L_PAGES as INDEX_OBJECT_P_SIZE,
184 T.LOB_OBJECT_L_PAGES as LONG_OBJECT_P_SIZE,
185 T.ROWS_READ,
186 T.ROWS_INSERTED + T.ROWS_UPDATED + T.ROWS_DELETED as ROWS_WRITTEN
187 FROM TABLE(MON_GET_TABLE('','',-2)) AS T
188 WHERE T.TABSCHEMA NOT LIKE 'SYS%'
189 `
190
191 // Index metrics using MON_GET_INDEX
192 queryIndexInstances = `
193 SELECT
194 I.TABSCHEMA as INDSCHEMA,
195 CAST(I.IID AS VARCHAR(128)) as INDNAME,
196 I.NLEAF,
197 I.INDEX_SCANS,
198 I.INDEX_ONLY_SCANS as FULL_SCANS
199 FROM TABLE(MON_GET_INDEX('','',-2)) AS I
200 WHERE I.TABSCHEMA NOT LIKE 'SYS%'
201 `
202
203 queryDatabaseStatus = `
204 SELECT
205 CASE
206 WHEN EXISTS (SELECT 1 FROM SYSIBMADM.SNAPDB WHERE DB_STATUS = 'ACTIVE') THEN 0
207 WHEN EXISTS (SELECT 1 FROM SYSIBMADM.SNAPDB WHERE DB_STATUS = 'QUIESCED') THEN 2
208 WHEN EXISTS (SELECT 1 FROM SYSIBMADM.SNAPDB WHERE DB_STATUS IN ('QUIESCE_PENDING', 'ROLLFORWARD')) THEN 1
209 ELSE 3
210 END as DB_STATUS_CHECK
211 FROM SYSIBM.SYSDUMMY1
212 `
213
214 queryCanConnect = `SELECT 1 as CAN_CONNECT FROM SYSIBM.SYSDUMMY1`
215
216 // Individual metric queries for resilience (following AS/400 pattern)
217 // Core connection metrics - should always be available on LUW
218 queryTotalConnections = `SELECT COUNT(*) FROM SYSIBMADM.APPLICATIONS`
219 queryActiveConnections = `SELECT COUNT(*) FROM SYSIBMADM.APPLICATIONS WHERE APPL_STATUS = 'CONNECTED'`
220 queryExecutingConnections = `SELECT COUNT(*) FROM SYSIBMADM.APPLICATIONS WHERE APPL_STATUS = 'UOWEXEC'`
221 queryIdleConnections = `SELECT COUNT(*) FROM SYSIBMADM.APPLICATIONS WHERE APPL_STATUS = 'CONNECTED' AND UOW_COMP_STATUS = 'NONE'`
222 queryMaxConnections = `SELECT COALESCE(NULLIF(VALUE, 'AUTOMATIC'), '40') FROM SYSIBMADM.DBCFG WHERE NAME = 'maxappls'`
223
224 // Core lock metrics - should be available on most DB2 editions
225 queryLockWaits = `SELECT SUM(LOCK_WAITS) FROM SYSIBMADM.SNAPDB`
226 queryLockTimeouts = `SELECT SUM(LOCK_TIMEOUTS) FROM SYSIBMADM.SNAPDB`
227 queryDeadlocks = `SELECT SUM(DEADLOCKS) FROM SYSIBMADM.SNAPDB`
228 queryLockEscalations = `SELECT SUM(LOCK_ESCALS) FROM SYSIBMADM.SNAPDB`
229 queryActiveLocks = `SELECT SUM(LOCKS_HELD) FROM SYSIBMADM.SNAPDB`
230 queryLockWaitTime = `SELECT SUM(LOCK_WAIT_TIME) FROM SYSIBMADM.SNAPDB`
231 queryLockWaitingAgents = `SELECT SUM(LOCKS_WAITING) FROM SYSIBMADM.SNAPDB`
232 queryLockMemoryPages = `SELECT SUM(LOCK_LIST_IN_USE) FROM SYSIBMADM.SNAPDB`
233
234 // Sorting metrics
235 queryTotalSorts = `SELECT SUM(TOTAL_SORTS) FROM SYSIBMADM.SNAPDB`
236 querySortOverflows = `SELECT SUM(SORT_OVERFLOWS) FROM SYSIBMADM.SNAPDB`
237
238 // Row activity metrics
239 queryRowsRead = `SELECT SUM(ROWS_READ) FROM SYSIBMADM.SNAPDB`
240 queryRowsModified = `SELECT SUM(ROWS_MODIFIED) FROM SYSIBMADM.SNAPDB`
241 queryRowsReturned = `SELECT SUM(ROWS_SELECTED) FROM SYSIBMADM.SNAPDB`
242
243 // Log space metrics
244 queryLogUsedSpace = `SELECT SUM(TOTAL_LOG_USED) FROM SYSIBMADM.LOG_UTILIZATION`
245 queryLogAvailableSpace = `SELECT SUM(TOTAL_LOG_AVAILABLE) FROM SYSIBMADM.LOG_UTILIZATION`
246 queryLogReads = `SELECT SUM(LOG_READS) FROM SYSIBMADM.SNAPDB`
247 queryLogWrites = `SELECT SUM(LOG_WRITES) FROM SYSIBMADM.SNAPDB`
248
249 // Buffer pool aggregate metrics
250 queryBufferpoolLogicalReads = `SELECT SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS) FROM SYSIBMADM.SNAPBP`
251 queryBufferpoolPhysicalReads = `SELECT SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) FROM SYSIBMADM.SNAPBP`
252 queryBufferpoolDataLogical = `SELECT SUM(POOL_DATA_L_READS) FROM SYSIBMADM.SNAPBP`
253 queryBufferpoolDataPhysical = `SELECT SUM(POOL_DATA_P_READS) FROM SYSIBMADM.SNAPBP`
254 queryBufferpoolIndexLogical = `SELECT SUM(POOL_INDEX_L_READS) FROM SYSIBMADM.SNAPBP`
255 queryBufferpoolIndexPhysical = `SELECT SUM(POOL_INDEX_P_READS) FROM SYSIBMADM.SNAPBP`
256 queryBufferpoolXDALogical = `SELECT SUM(POOL_XDA_L_READS) FROM SYSIBMADM.SNAPBP`
257 queryBufferpoolXDAPhysical = `SELECT SUM(POOL_XDA_P_READS) FROM SYSIBMADM.SNAPBP`
258 queryBufferpoolColumnLogical = `SELECT SUM(POOL_COL_L_READS) FROM SYSIBMADM.SNAPBP`
259 queryBufferpoolColumnPhysical = `SELECT SUM(POOL_COL_P_READS) FROM SYSIBMADM.SNAPBP`
260
261 // Hit ratio components for calculation
262 queryBufferpoolDataHits = `SELECT SUM(POOL_DATA_LBP_PAGES_FOUND) FROM SYSIBMADM.SNAPBP`
263 queryBufferpoolIndexHits = `SELECT SUM(POOL_INDEX_LBP_PAGES_FOUND) FROM SYSIBMADM.SNAPBP`
264 queryBufferpoolXDAHits = `SELECT SUM(POOL_XDA_LBP_PAGES_FOUND) FROM SYSIBMADM.SNAPBP`
265 queryBufferpoolColumnHits = `SELECT SUM(POOL_COL_LBP_PAGES_FOUND) FROM SYSIBMADM.SNAPBP`
266
267 // Long running queries
268 queryLongRunningTotal = `SELECT COUNT(*) FROM SYSIBMADM.LONG_RUNNING_SQL WHERE ELAPSED_TIME_MIN > 0`
269 queryLongRunningWarning = `SELECT COUNT(*) FROM SYSIBMADM.LONG_RUNNING_SQL WHERE ELAPSED_TIME_MIN >= 5 AND ELAPSED_TIME_MIN < 15`
270 queryLongRunningCritical = `SELECT COUNT(*) FROM SYSIBMADM.LONG_RUNNING_SQL WHERE ELAPSED_TIME_MIN >= 15`
271
272 // Modern MON_GET_* function queries (DB2 9.7+ LUW)
273 // These provide better performance and real-time data compared to SNAP* views
274
275 // Database-level metrics using MON_GET_DATABASE
276 queryMonGetDatabase = `
277 SELECT
278 SUM(LOCK_WAITS) as LOCK_WAITS,
279 SUM(LOCK_TIMEOUTS) as LOCK_TIMEOUTS,
280 SUM(DEADLOCKS) as DEADLOCKS,
281 SUM(LOCK_ESCALS) as LOCK_ESCALS,
282 SUM(NUM_LOCKS_HELD) as LOCK_ACTIVE,
283 SUM(LOCK_WAIT_TIME) as LOCK_WAIT_TIME,
284 SUM(NUM_LOCKS_WAITING) as LOCK_WAITING_AGENTS,
285 SUM(LOCK_LIST_IN_USE) as LOCK_MEMORY_PAGES,
286 SUM(TOTAL_SORTS) as TOTAL_SORTS,
287 SUM(SORT_OVERFLOWS) as SORT_OVERFLOWS,
288 SUM(ROWS_READ) as ROWS_READ,
289 SUM(ROWS_MODIFIED) as ROWS_MODIFIED,
290 SUM(ROWS_RETURNED) as ROWS_RETURNED
291 FROM TABLE(MON_GET_DATABASE(-2)) AS T
292 `
293
294 // Buffer pool metrics using MON_GET_BUFFERPOOL
295 queryMonGetBufferpool = `
296 SELECT
297 BP_NAME,
298 POOL_DATA_L_READS,
299 POOL_DATA_P_READS,
300 POOL_INDEX_L_READS,
301 POOL_INDEX_P_READS,
302 POOL_XDA_L_READS,
303 POOL_XDA_P_READS,
304 POOL_COL_L_READS,
305 POOL_COL_P_READS,
306 POOL_DATA_LBP_PAGES_FOUND,
307 POOL_INDEX_LBP_PAGES_FOUND,
308 POOL_XDA_LBP_PAGES_FOUND,
309 POOL_COL_LBP_PAGES_FOUND,
310 AUTOMATIC,
311 BP_CUR_BUFFSZ as POOL_CUR_SIZE,
312 0 as POOL_WATERMARK
313 FROM TABLE(MON_GET_BUFFERPOOL('',-2)) AS T
314 `
315
316 // Aggregate buffer pool metrics - use MON_GET approach (hits = logical - physical)
317 queryMonGetBufferpoolAggregate = `
318 SELECT
319 SUM(POOL_DATA_L_READS) as DATA_LOGICAL_READS,
320 SUM(POOL_DATA_P_READS) as DATA_PHYSICAL_READS,
321 SUM(POOL_INDEX_L_READS) as INDEX_LOGICAL_READS,
322 SUM(POOL_INDEX_P_READS) as INDEX_PHYSICAL_READS,
323 SUM(POOL_XDA_L_READS) as XDA_LOGICAL_READS,
324 SUM(POOL_XDA_P_READS) as XDA_PHYSICAL_READS,
325 SUM(POOL_COL_L_READS) as COLUMN_LOGICAL_READS,
326 SUM(POOL_COL_P_READS) as COLUMN_PHYSICAL_READS,
327 SUM(POOL_DATA_L_READS - POOL_DATA_P_READS) as DATA_HITS,
328 SUM(POOL_INDEX_L_READS - POOL_INDEX_P_READS) as INDEX_HITS,
329 SUM(POOL_XDA_L_READS - POOL_XDA_P_READS) as XDA_HITS,
330 SUM(POOL_COL_L_READS - POOL_COL_P_READS) as COLUMN_HITS,
331 SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES) as TOTAL_WRITES
332 FROM TABLE(MON_GET_BUFFERPOOL('',-2)) AS T
333 `
334
335 // Transaction log metrics using MON_GET_TRANSACTION_LOG
336 queryMonGetTransactionLog = `
337 SELECT
338 TOTAL_LOG_USED as TOTAL_LOG_USED,
339 TOTAL_LOG_AVAILABLE as TOTAL_LOG_AVAILABLE,
340 CASE
341 WHEN TOTAL_LOG_AVAILABLE > 0
342 THEN (TOTAL_LOG_USED * 100) / TOTAL_LOG_AVAILABLE
343 ELSE 0
344 END as LOG_UTILIZATION,
345 LOG_READS as LOG_READS,
346 LOG_WRITES as LOG_WRITES
347 FROM TABLE(MON_GET_TRANSACTION_LOG(-2)) AS T
348 WHERE MEMBER = 0
349 `
350
351 // Tablespace metrics using MON_GET_TABLESPACE
352 queryMonGetTablespace = `
353 SELECT
354 TBSP_NAME,
355 TBSP_TYPE,
356 TBSP_CONTENT_TYPE,
357 TBSP_STATE,
358 TBSP_TOTAL_PAGES * TBSP_PAGE_SIZE as TOTAL_SIZE,
359 TBSP_USED_PAGES * TBSP_PAGE_SIZE as USED_SIZE,
360 TBSP_FREE_PAGES * TBSP_PAGE_SIZE as FREE_SIZE,
361 (TBSP_TOTAL_PAGES - TBSP_PENDING_FREE_PAGES) * TBSP_PAGE_SIZE as USABLE_SIZE,
362 CASE
363 WHEN TBSP_TOTAL_PAGES > 0
364 THEN (TBSP_USED_PAGES * 100) / TBSP_TOTAL_PAGES
365 ELSE 0
366 END as USED_PERCENT,
367 TBSP_PAGE_SIZE
368 FROM TABLE(MON_GET_TABLESPACE('',-2)) AS T
369 WHERE TBSP_TYPE = 'DMS'
370 `
371
372 // Connection metrics using MON_GET_CONNECTION
373 queryMonGetConnections = `
374 SELECT
375 COUNT(*) as TOTAL_CONNS,
376 SUM(CASE WHEN APPLICATION_HANDLE IS NOT NULL THEN 1 ELSE 0 END) as ACTIVE_CONNS,
377 SUM(CASE WHEN CLIENT_IDLE_WAIT_TIME > 0 THEN 1 ELSE 0 END) as IDLE_CONNS,
378 SUM(CASE WHEN UOW_START_TIME IS NOT NULL THEN 1 ELSE 0 END) as EXECUTING_CONNS
379 FROM TABLE(MON_GET_CONNECTION(NULL,-2)) AS T
380 `
381
382 // Individual connection details
383 // FIXED: Removed dynamic "top X" ORDER BY + FETCH FIRST pattern for stable time-series
384 queryMonGetConnectionDetails = `
385 SELECT
386 APPLICATION_ID,
387 APPLICATION_NAME,
388 CLIENT_HOSTNAME,
389 CLIENT_IPADDR,
390 SESSION_AUTH_ID,
391 CASE
392 WHEN UOW_START_TIME IS NOT NULL THEN 'UOWEXEC'
393 ELSE 'CONNECTED'
394 END as APPL_STATUS,
395 ROWS_READ,
396 ROWS_MODIFIED + ROWS_INSERTED + ROWS_UPDATED + ROWS_DELETED as ROWS_WRITTEN,
397 TOTAL_CPU_TIME
398 FROM TABLE(MON_GET_CONNECTION(NULL,-2)) AS T
399 -- WHERE APPLICATION_HANDLE IS NOT NULL
400 `
401
402 // Memory pool monitoring using MON_GET_MEMORY_POOL
403 queryMonGetMemoryPool = `
404 SELECT
405 MEMORY_SET_TYPE,
406 MEMORY_POOL_TYPE,
407 MEMORY_POOL_USED,
408 MEMORY_POOL_USED_HWM
409 FROM TABLE(MON_GET_MEMORY_POOL('DATABASE', '', -2)) AS T
410 ORDER BY MEMORY_POOL_USED DESC
411 `
412
413 // Instance Memory Sets monitoring (Screen 26) using MON_GET_MEMORY_SET
414 // FIXED: Removed dynamic "top X" ORDER BY + FETCH FIRST pattern for stable time-series
415 queryMonGetMemorySet = `
416 SELECT
417 HOST_NAME,
418 DB_NAME,
419 MEMORY_SET_TYPE,
420 MEMBER,
421 MEMORY_SET_USED,
422 MEMORY_SET_COMMITTED,
423 MEMORY_SET_USED_HWM,
424 (MEMORY_SET_COMMITTED - MEMORY_SET_USED) as ADDITIONAL_COMMITTED,
425 CASE
426 WHEN MEMORY_SET_USED_HWM > 0
427 THEN (MEMORY_SET_USED * 100) / MEMORY_SET_USED_HWM
428 ELSE 0
429 END as PERCENT_USED_HWM
430 FROM TABLE(MON_GET_MEMORY_SET(NULL, NULL, -2)) AS T
431 `
432
433 // Enhanced connection wait metrics
434 // FIXED: Removed dynamic "top X" ORDER BY + FETCH FIRST pattern for stable time-series
435 queryMonGetConnectionWaits = `
436 SELECT
437 APPLICATION_ID,
438 TOTAL_WAIT_TIME,
439 LOCK_WAIT_TIME,
440 DIRECT_READ_TIME + DIRECT_WRITE_TIME as IO_WAIT_TIME,
441 CLIENT_IDLE_WAIT_TIME,
442 TOTAL_RQST_TIME,
443 TOTAL_ACT_TIME
444 FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS T
445 WHERE APPLICATION_HANDLE IS NOT NULL
446 AND TOTAL_WAIT_TIME > 0
447 `
448
449 // Table I/O statistics using MON_GET_TABLE
450 // FIXED: Removed dynamic "top X" ORDER BY + FETCH FIRST pattern for stable time-series
451 queryMonGetTable = `
452 SELECT
453 TABSCHEMA,
454 TABNAME,
455 TABLE_SCANS,
456 ROWS_READ,
457 ROWS_INSERTED,
458 ROWS_UPDATED,
459 ROWS_DELETED,
460 OVERFLOW_ACCESSES
461 FROM TABLE(MON_GET_TABLE(NULL, NULL, -2)) AS T
462 `
463
464 // Enhanced buffer pool metrics
465 queryMonGetBufferpoolEnhanced = `
466 SELECT
467 BP_NAME,
468 POOL_DATA_L_READS,
469 POOL_DATA_P_READS,
470 POOL_INDEX_L_READS,
471 POOL_INDEX_P_READS,
472 POOL_XDA_L_READS,
473 POOL_XDA_P_READS,
474 POOL_COL_L_READS,
475 POOL_COL_P_READS,
476 POOL_DATA_LBP_PAGES_FOUND,
477 POOL_INDEX_LBP_PAGES_FOUND,
478 POOL_XDA_LBP_PAGES_FOUND,
479 POOL_COL_LBP_PAGES_FOUND,
480 POOL_ASYNC_DATA_READS,
481 POOL_ASYNC_DATA_WRITES,
482 POOL_ASYNC_INDEX_READS,
483 POOL_ASYNC_INDEX_WRITES,
484 POOL_ASYNC_XDA_READS,
485 POOL_ASYNC_XDA_WRITES,
486 PREFETCH_WAIT_TIME,
487 POOL_DRTY_PG_STEAL_CLNS,
488 POOL_DRTY_PG_THRSH_CLNS,
489 AUTOMATIC,
490 BP_CUR_BUFFSZ as POOL_CUR_SIZE,
491 0 as POOL_WATERMARK
492 FROM TABLE(MON_GET_BUFFERPOOL('',-2)) AS T
493 `
494
495 // Database Overview queries (Screen 01)
496 queryDatabaseOverview = `
497 WITH CPU_METRICS AS (
498 SELECT
499 CPU_USER * 100 AS CPU_USER_PERCENT,
500 CPU_SYSTEM * 100 AS CPU_SYSTEM_PERCENT,
501 CPU_IDLE * 100 AS CPU_IDLE_PERCENT,
502 CPU_IOWAIT * 100 AS CPU_IOWAIT_PERCENT
503 FROM TABLE(SYSPROC.ENV_GET_SYSTEM_RESOURCES()) AS T
504 ),
505 CONNECTION_METRICS AS (
506 SELECT
507 SUM(CASE WHEN APPLICATION_HANDLE IS NOT NULL THEN 1 ELSE 0 END) AS CONNECTIONS_ACTIVE,
508 COUNT(*) AS CONNECTIONS_TOTAL
509 FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS T
510 ),
511 MEMORY_METRICS AS (
512 SELECT
513 SUM(CASE WHEN MEMORY_SET_TYPE = 'DATABASE' THEN MEMORY_SET_COMMITTED ELSE 0 END) AS MEMORY_DATABASE_COMMITTED,
514 SUM(CASE WHEN MEMORY_SET_TYPE = 'INSTANCE' THEN MEMORY_SET_COMMITTED ELSE 0 END) AS MEMORY_INSTANCE_COMMITTED,
515 (SELECT SUM(MEMORY_POOL_USED) FROM TABLE(MON_GET_MEMORY_POOL('DATABASE', '', -2)) WHERE MEMORY_POOL_TYPE = 'BP') AS MEMORY_BUFFERPOOL_USED,
516 (SELECT SUM(MEMORY_POOL_USED) FROM TABLE(MON_GET_MEMORY_POOL('DATABASE', '', -2)) WHERE MEMORY_POOL_TYPE = 'SHARED_SORT') AS MEMORY_SHARED_SORT_USED
517 FROM TABLE(MON_GET_MEMORY_SET(NULL, NULL, -2))
518 ),
519 THROUGHPUT_METRICS AS (
520 SELECT
521 SUM(SELECT_SQL_STMTS) AS OPS_SELECT_STMTS,
522 SUM(UID_SQL_STMTS) AS OPS_UID_STMTS,
523 SUM(TOTAL_APP_COMMITS + TOTAL_APP_ROLLBACKS) AS OPS_TRANSACTIONS,
524 0 AS OPS_ACTIVITIES_ABORTED
525 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
526 ),
527 TIME_SPENT AS (
528 SELECT
529 CASE WHEN SUM(DIRECT_READS) > 0
530 THEN SUM(DIRECT_READ_TIME) / SUM(DIRECT_READS) ELSE 0 END AS TIME_AVG_DIRECT_READ,
531 CASE WHEN SUM(DIRECT_WRITES) > 0
532 THEN SUM(DIRECT_WRITE_TIME) / SUM(DIRECT_WRITES) ELSE 0 END AS TIME_AVG_DIRECT_WRITE,
533 CASE WHEN SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) > 0
534 THEN SUM(POOL_READ_TIME) / SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) ELSE 0 END AS TIME_AVG_POOL_READ,
535 CASE WHEN SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) > 0
536 THEN SUM(POOL_WRITE_TIME) / SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) ELSE 0 END AS TIME_AVG_POOL_WRITE
537 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
538 ),
539 DB_STATUS AS (
540 SELECT
541 CASE WHEN DB_STATUS = 'ACTIVE' THEN 1 ELSE 0 END AS DATABASE_ACTIVE,
542 CASE WHEN DB_STATUS != 'ACTIVE' THEN 1 ELSE 0 END AS DATABASE_INACTIVE
543 FROM TABLE(MON_GET_DATABASE(-2))
544 FETCH FIRST 1 ROW ONLY
545 )
546 SELECT * FROM CPU_METRICS, CONNECTION_METRICS, MEMORY_METRICS,
547 THROUGHPUT_METRICS, TIME_SPENT, DB_STATUS
548 `
549
550 // Alternative simpler query for older DB2 versions using SNAP views
551 queryDatabaseOverviewSimple = `
552 SELECT
553 -- Database status (always active when we can query)
554 1 AS DATABASE_ACTIVE,
555 0 AS DATABASE_INACTIVE,
556 -- CPU metrics (not available in SNAP views)
557 0 AS CPU_USER_PERCENT,
558 0 AS CPU_SYSTEM_PERCENT,
559 0 AS CPU_IDLE_PERCENT,
560 0 AS CPU_IOWAIT_PERCENT,
561 -- Connection metrics from SNAPAPPL_INFO
562 (SELECT COUNT(*) FROM SYSIBMADM.SNAPAPPL_INFO WHERE AGENT_ID > 0) AS CONNECTIONS_ACTIVE,
563 (SELECT COUNT(*) FROM SYSIBMADM.SNAPAPPL_INFO) AS CONNECTIONS_TOTAL,
564 -- Memory metrics (basic, from SNAPDB)
565 COALESCE((SELECT SUM(POOL_CUR_SIZE) FROM SYSIBMADM.SNAPDB), 0) AS MEMORY_DATABASE_COMMITTED,
566 0 AS MEMORY_INSTANCE_COMMITTED,
567 0 AS MEMORY_BUFFERPOOL_USED,
568 0 AS MEMORY_SHARED_SORT_USED,
569 -- Throughput metrics from SNAPDB
570 COALESCE((SELECT SUM(SELECT_SQL_STMTS) FROM SYSIBMADM.SNAPDB), 0) AS OPS_SELECT_STMTS,
571 COALESCE((SELECT SUM(UID_SQL_STMTS) FROM SYSIBMADM.SNAPDB), 0) AS OPS_UID_STMTS,
572 COALESCE((SELECT SUM(TOTAL_APP_COMMITS + INT_COMMITS + TOTAL_APP_ROLLBACKS + INT_ROLLBACKS) FROM SYSIBMADM.SNAPDB), 0) AS OPS_TRANSACTIONS,
573 0 AS OPS_ACTIVITIES_ABORTED,
574 -- Time spent (basic averages from SNAPDB)
575 COALESCE((SELECT CASE WHEN SUM(DIRECT_READS) > 0 THEN SUM(DIRECT_READ_TIME) / SUM(DIRECT_READS) ELSE 0 END FROM SYSIBMADM.SNAPDB), 0) AS TIME_AVG_DIRECT_READ,
576 COALESCE((SELECT CASE WHEN SUM(DIRECT_WRITES) > 0 THEN SUM(DIRECT_WRITE_TIME) / SUM(DIRECT_WRITES) ELSE 0 END FROM SYSIBMADM.SNAPDB), 0) AS TIME_AVG_DIRECT_WRITE,
577 COALESCE((SELECT CASE WHEN SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) > 0 THEN SUM(POOL_READ_TIME) / SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) ELSE 0 END FROM SYSIBMADM.SNAPBP), 0) AS TIME_AVG_POOL_READ,
578 COALESCE((SELECT CASE WHEN SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) > 0 THEN SUM(POOL_WRITE_TIME) / SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) ELSE 0 END FROM SYSIBMADM.SNAPBP), 0) AS TIME_AVG_POOL_WRITE
579 FROM SYSIBM.SYSDUMMY1
580 `
581
582 // Enhanced logging performance query (Screen 18) - using tested dcmtop queries
583 queryLoggingPerformance = `
584 SELECT
585 SUM(TOTAL_APP_COMMITS) AS LOG_COMMITS,
586 SUM(TOTAL_APP_ROLLBACKS) AS LOG_ROLLBACKS
587 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
588 `
589
590 queryLoggingReads = `
591 SELECT SUM(NUM_LOG_READ_IO) AS LOG_READS FROM TABLE(MON_GET_TRANSACTION_LOG(-2))
592 `
593
594 queryLoggingWrites = `
595 SELECT SUM(NUM_LOG_WRITE_IO) AS LOG_WRITES FROM TABLE(MON_GET_TRANSACTION_LOG(-2))
596 `
597
598 queryLoggingBufferEvents = `
599 SELECT SUM(NUM_LOG_BUFFER_FULL) AS LOG_BUFFER_FULL_EVENTS FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
600 `
601
602 // Individual logging queries from dcmtop (Screen 18)
603 queryLogCommits = `
604 SELECT SUM(TOTAL_APP_COMMITS) AS LOG_COMMITS FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
605 `
606
607 queryLogRollbacks = `
608 SELECT SUM(TOTAL_APP_ROLLBACKS) AS LOG_ROLLBACKS FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
609 `
610
611 // Simpler version for older DB2
612 queryLoggingPerformanceSimple = `
613 SELECT
614 SUM(TOTAL_APP_COMMITS) AS LOG_COMMITS,
615 SUM(TOTAL_APP_ROLLBACKS) AS LOG_ROLLBACKS,
616 SUM(LOG_READS) AS LOG_READS,
617 SUM(LOG_WRITES) AS LOG_WRITES,
618 0 AS LOG_BUFFER_FULL_EVENTS,
619 0 AS LOG_AVG_COMMIT_TIME,
620 0 AS LOG_AVG_READ_TIME,
621 0 AS LOG_AVG_WRITE_TIME
622 FROM SYSIBMADM.SNAPDB
623 `
624
625 // Federation metrics query (Screen 32)
626 queryFederationMetrics = `
627 SELECT
628 SUM(CASE WHEN ROWS_RETURNED_FROM_REMOTE > 0 THEN 1 ELSE 0 END) AS FED_CONNECTIONS_ACTIVE,
629 SUM(CASE WHEN ROWS_RETURNED_FROM_REMOTE = 0 THEN 1 ELSE 0 END) AS FED_CONNECTIONS_IDLE,
630 SUM(ROWS_RETURNED_FROM_REMOTE) AS FED_ROWS_READ,
631 SUM(SELECT_SQL_STMTS) AS FED_SELECT_STMTS,
632 SUM(TOTAL_WAIT_TIME) AS FED_WAITS_TOTAL
633 FROM TABLE(MON_GET_CONNECTION(NULL, -2))
634 WHERE APPLICATION_NAME IS NOT NULL
635 `
636
637 // Simpler federation query without FILTER clause
638 queryFederationMetricsSimple = `
639 SELECT
640 SUM(CASE WHEN ROWS_RETURNED_FROM_REMOTE > 0 THEN 1 ELSE 0 END) AS FED_CONNECTIONS_ACTIVE,
641 SUM(CASE WHEN ROWS_RETURNED_FROM_REMOTE = 0 THEN 1 ELSE 0 END) AS FED_CONNECTIONS_IDLE,
642 SUM(ROWS_RETURNED_FROM_REMOTE) AS FED_ROWS_READ,
643 SUM(SELECT_SQL_STMTS) AS FED_SELECT_STMTS,
644 SUM(TOTAL_WAIT_TIME) AS FED_WAITS_TOTAL
645 FROM TABLE(MON_GET_CONNECTION(NULL, -2))
646 WHERE APPLICATION_NAME IS NOT NULL
647 `
648
649 // Memory Sets query (Screen 26)
650 queryMemorySets = `
651 SELECT
652 HOST_NAME,
653 DB_NAME,
654 MEMORY_SET_TYPE,
655 MEMBER,
656 MEMORY_SET_USED,
657 MEMORY_SET_COMMITTED,
658 (MEMORY_SET_COMMITTED - MEMORY_SET_USED) AS ADDITIONAL_COMMITTED,
659 MEMORY_SET_USED_HWM,
660 CASE
661 WHEN SUM(MEMORY_SET_COMMITTED) OVER () > 0
662 THEN (MEMORY_SET_COMMITTED * 100.0) / SUM(MEMORY_SET_COMMITTED) OVER ()
663 ELSE 0
664 END AS PERCENT_COMMITTED
665 FROM TABLE(MON_GET_MEMORY_SET(NULL, NULL, -2))
666 ORDER BY MEMORY_SET_TYPE
667 `
668
669 // // Prefetcher metrics query (Screen 15)
670 // queryPrefetcherMetrics = `
671 // SELECT
672 // BP_NAME,
673 // CASE
674 // WHEN (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) > 0
675 // THEN DECIMAL((POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS +
676 // POOL_ASYNC_XDA_READS + POOL_ASYNC_COL_READS) * 100.0 /
677 // (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS), 5, 2)
678 // ELSE 0.00
679 // END AS PREFETCH_RATIO,
680 // CASE
681 // WHEN (POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES + POOL_COL_WRITES) > 0
682 // THEN DECIMAL((POOL_ASYNC_DATA_WRITES + POOL_ASYNC_INDEX_WRITES +
683 // POOL_ASYNC_XDA_WRITES + POOL_ASYNC_COL_WRITES) * 100.0 /
684 // (POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES + POOL_COL_WRITES), 5, 2)
685 // ELSE 0.00
686 // END AS CLEANER_RATIO,
687 // (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) AS PHYSICAL_READS,
688 // (POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS + POOL_ASYNC_XDA_READS + POOL_ASYNC_COL_READS) AS ASYNC_READS,
689 // UNREAD_PREFETCH_PAGES,
690 // CASE
691 // WHEN PREFETCH_WAITS > 0
692 // THEN DECIMAL(PREFETCH_WAIT_TIME / PREFETCH_WAITS, 10, 2)
693 // ELSE 0.00
694 // END AS AVG_WAIT_TIME
695 // FROM TABLE(MON_GET_BUFFERPOOL('', -2))
696 // `
697 //
698 // Database Overview Simple Queries (based on dcmtop)
699 // These are individual queries that are more resilient and easier to debug
700
701 // Overview queries
702 querySimpleDatabaseStatus = `SELECT MAX(DB_STATUS) AS DATABASE_STATUS FROM TABLE(MON_GET_DATABASE(-2))`
703 querySimpleStartTime = `SELECT MIN(DB_CONN_TIME) AS START_TIME FROM TABLE(MON_GET_DATABASE(-2))`
704 querySimpleSystemMemory = `SELECT MEMORY_TOTAL AS SYSTEM_PHYSICAL_MEM FROM TABLE(SYSPROC.ENV_GET_SYSTEM_RESOURCES())`
705
706 // CPU queries
707 querySimpleCPUDB2 = `
708 SELECT
709 SUM(CPU_USER) AS DB2_CPU_USER_TOTAL,
710 SUM(CPU_SYSTEM) AS DB2_CPU_SYSTEM_TOTAL
711 FROM TABLE(ENV_GET_DB2_SYSTEM_RESOURCES(-2))
712 `
713 querySimpleCPUSystem = `
714 SELECT
715 CPU_USER AS CPU_USER_TOTAL,
716 CPU_SYSTEM AS CPU_SYSTEM_TOTAL,
717 CPU_IDLE AS CPU_IDLE_TOTAL,
718 CPU_IOWAIT AS CPU_IOWAIT_TOTAL,
719 CASE
720 WHEN (CPU_USER + CPU_SYSTEM + CPU_IDLE + CPU_IOWAIT) > 0
721 THEN ((CPU_USER + CPU_SYSTEM) * 100.0) / (CPU_USER + CPU_SYSTEM + CPU_IDLE + CPU_IOWAIT)
722 ELSE 0
723 END AS SYSTEM_CPU_UTILIZATION
724 FROM TABLE(SYSPROC.ENV_GET_SYSTEM_RESOURCES())
725 `
726
727 // Memory queries
728 querySimpleMemoryInstance = `
729 SELECT SUM(MEMORY_SET_COMMITTED) AS INSTANCE_MEM_COMMITTED
730 FROM TABLE(MON_GET_MEMORY_SET('DBMS', CURRENT_SERVER, -2))
731 `
732 querySimpleMemoryDatabase = `
733 SELECT SUM(MEMORY_SET_COMMITTED) AS DATABASE_MEM_COMMITTED
734 FROM TABLE(MON_GET_MEMORY_SET('DATABASE', CURRENT_SERVER, -2))
735 `
736 querySimpleMemoryBufferpool = `
737 SELECT SUM(MEMORY_POOL_USED) AS BUFFERPOOL_MEM_USED
738 FROM TABLE(MON_GET_MEMORY_POOL('DATABASE', '', -2))
739 WHERE MEMORY_POOL_TYPE = 'BP'
740 `
741 querySimpleMemorySharedSort = `
742 SELECT SUM(MEMORY_POOL_USED) AS SHARED_SORT_MEM_USED
743 FROM TABLE(MON_GET_MEMORY_POOL('DATABASE', '', -2))
744 WHERE MEMORY_POOL_TYPE = 'SHARED_SORT'
745 `
746
747 // Storage query
748 querySimpleStorageUsage = `
749 SELECT
750 SUM(TBSP_TOTAL_PAGES * TBSP_PAGE_SIZE) AS TOTAL_STORAGE,
751 SUM(TBSP_USED_PAGES * TBSP_PAGE_SIZE) AS USED_STORAGE,
752 SUM(TBSP_FREE_PAGES * TBSP_PAGE_SIZE) AS FREE_STORAGE
753 FROM TABLE(MON_GET_TABLESPACE('', -2))
754 WHERE TBSP_TYPE = 'DMS'
755 `
756
757 // Throughput queries
758 querySimpleTransactions = `
759 SELECT SUM(TOTAL_APP_COMMITS + INT_COMMITS + TOTAL_APP_ROLLBACKS + INT_ROLLBACKS) AS TRANSACTIONS
760 FROM TABLE(MON_GET_DATABASE(NULL))
761 `
762 querySimpleSelectStmts = `
763 SELECT SUM(SELECT_SQL_STMTS) AS SELECT_STMTS
764 FROM TABLE(MON_GET_DATABASE(NULL))
765 `
766 querySimpleUIDStmts = `
767 SELECT SUM(UID_SQL_STMTS) AS UID_STMTS
768 FROM TABLE(MON_GET_DATABASE(NULL))
769 `
770 querySimpleActivitiesAborted = `
771 SELECT SUM(ACT_ABORTED_TOTAL) AS ACTIVITIES_ABORTED
772 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, NULL))
773 `
774 querySnapActivitiesAborted = `SELECT 0 AS ACTIVITIES_ABORTED`
775 querySimpleActivitiesQueued = `
776 SELECT SUM(WLM_QUEUE_ASSIGNMENTS_TOTAL) AS ACTIVITIES_QUEUED
777 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
778 `
779 querySimpleLogReads = `
780 SELECT SUM(NUM_LOG_READ_IO) AS LOG_READS
781 FROM TABLE(MON_GET_TRANSACTION_LOG(-2))
782 `
783 querySimpleLogWrites = `
784 SELECT SUM(NUM_LOG_WRITE_IO) AS LOG_WRITES
785 FROM TABLE(MON_GET_TRANSACTION_LOG(-2))
786 `
787 querySimpleLogicalReads = `
788 SELECT SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS + POOL_COL_L_READS) AS LOGICAL_READS
789 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
790 `
791 querySimplePhysicalReads = `
792 SELECT SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS) AS PHYSICAL_READS
793 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
794 `
795 querySimpleAsyncReads = `
796 SELECT SUM(POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS + POOL_ASYNC_XDA_READS + POOL_ASYNC_COL_READS) AS ASYNC_READS
797 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
798 `
799 querySimpleWrites = `
800 SELECT SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES + POOL_COL_WRITES) AS WRITES
801 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
802 `
803 querySimpleAsyncWrites = `
804 SELECT SUM(POOL_ASYNC_DATA_WRITES + POOL_ASYNC_INDEX_WRITES + POOL_ASYNC_XDA_WRITES + POOL_ASYNC_COL_WRITES) AS ASYNC_WRITES
805 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
806 `
807
808 // Contention queries
809 querySimpleConnectionsActive = `
810 SELECT COUNT(*) AS ACTIVE_CONNECTIONS
811 FROM TABLE(MON_GET_CONNECTION(NULL, -2))
812 WHERE APPLICATION_HANDLE IS NOT NULL
813 `
814 querySimpleConnectionsTotal = `
815 SELECT COUNT(*) AS TOTAL_CONNECTIONS
816 FROM TABLE(MON_GET_CONNECTION(NULL, -2))
817 `
818 querySimpleLockHeld = `
819 SELECT SUM(NUM_LOCKS_HELD) AS LOCKS_HELD
820 FROM TABLE(MON_GET_DATABASE(-2))
821 `
822 querySimpleLockWaits = `
823 SELECT SUM(LOCK_WAITS) AS LOCK_WAITS
824 FROM TABLE(MON_GET_DATABASE(-2))
825 `
826 querySimpleLockTimeouts = `
827 SELECT SUM(LOCK_TIMEOUTS) AS LOCK_TIMEOUTS
828 FROM TABLE(MON_GET_DATABASE(-2))
829 `
830 querySimpleLockEscalations = `
831 SELECT SUM(LOCK_ESCALS) AS LOCK_ESCALATIONS
832 FROM TABLE(MON_GET_DATABASE(-2))
833 `
834 querySimpleDeadlocks = `
835 SELECT SUM(DEADLOCKS) AS DEADLOCKS
836 FROM TABLE(MON_GET_DATABASE(-2))
837 `
838 querySimpleThresholdViolations = `
839 SELECT SUM(THRESH_VIOLATIONS) AS THRESHOLD_VIOLATIONS
840 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
841 `
842 querySimpleHitRatio = `
843 SELECT
844 SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS +
845 POOL_TEMP_DATA_L_READS + POOL_TEMP_INDEX_L_READS + POOL_TEMP_XDA_L_READS +
846 POOL_COL_L_READS + POOL_TEMP_COL_L_READS) AS LOGICAL_READS,
847 SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS +
848 POOL_TEMP_DATA_P_READS + POOL_TEMP_INDEX_P_READS + POOL_TEMP_XDA_P_READS +
849 POOL_COL_P_READS + POOL_TEMP_COL_P_READS) AS PHYSICAL_READS,
850 SUM(DIRECT_READS) AS DIRECT_READS,
851 CASE
852 WHEN SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS +
853 POOL_TEMP_DATA_L_READS + POOL_TEMP_INDEX_L_READS + POOL_TEMP_XDA_L_READS +
854 POOL_COL_L_READS + POOL_TEMP_COL_L_READS + DIRECT_READS) > 0
855 THEN (SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS +
856 POOL_TEMP_DATA_P_READS + POOL_TEMP_INDEX_P_READS + POOL_TEMP_XDA_P_READS +
857 POOL_COL_P_READS + POOL_TEMP_COL_P_READS + DIRECT_READS) * 1.0) /
858 SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS +
859 POOL_TEMP_DATA_L_READS + POOL_TEMP_INDEX_L_READS + POOL_TEMP_XDA_L_READS +
860 POOL_COL_L_READS + POOL_TEMP_COL_L_READS + DIRECT_READS)
861 ELSE 0
862 END AS HIT_RATIO
863 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
864 `
865
866 // Time spent queries
867 querySimpleAvgPoolReadTime = `
868 SELECT
869 CASE
870 WHEN SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) > 0
871 THEN SUM(POOL_READ_TIME) / SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS)
872 ELSE 0
873 END AS AVG_POOL_READ_TIME
874 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
875 `
876 querySimpleAvgDirectReadTime = `
877 SELECT
878 CASE
879 WHEN SUM(DIRECT_READS) > 0
880 THEN SUM(DIRECT_READ_TIME) / SUM(DIRECT_READS)
881 ELSE 0
882 END AS AVG_DIRECT_READ_TIME
883 FROM TABLE(MON_GET_DATABASE(-2))
884 `
885 querySimpleAvgPoolWriteTime = `
886 SELECT
887 CASE
888 WHEN SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) > 0
889 THEN SUM(POOL_WRITE_TIME) / SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES)
890 ELSE 0
891 END AS AVG_POOL_WRITE_TIME
892 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
893 `
894 querySimpleAvgDirectWriteTime = `
895 SELECT
896 CASE
897 WHEN SUM(DIRECT_WRITES) > 0
898 THEN SUM(DIRECT_WRITE_TIME) / SUM(DIRECT_WRITES)
899 ELSE 0
900 END AS AVG_DIRECT_WRITE_TIME
901 FROM TABLE(MON_GET_DATABASE(-2))
902 `
903 querySimpleSorts = `
904 SELECT SUM(TOTAL_SORTS) AS SORTS
905 FROM TABLE(MON_GET_DATABASE(-2))
906 `
907 querySimpleSortOverflows = `
908 SELECT SUM(SORT_OVERFLOWS) AS SORT_OVERFLOWS
909 FROM TABLE(MON_GET_DATABASE(-2))
910 `
911 querySimpleHashJoins = `
912 SELECT SUM(TOTAL_HASH_JOINS) AS HASH_JOINS
913 FROM TABLE(MON_GET_DATABASE(-2))
914 `
915 querySimpleHashJoinOverflows = `
916 SELECT SUM(HASH_JOIN_OVERFLOWS) AS HASH_JOIN_OVERFLOWS
917 FROM TABLE(MON_GET_DATABASE(-2))
918 `
919 querySimpleHashGrpbys = `
920 SELECT SUM(TOTAL_HASH_GRPBYS) AS HASH_GRPBYS
921 FROM TABLE(MON_GET_DATABASE(-2))
922 `
923 querySimpleHashGrpbyOverflows = `
924 SELECT SUM(HASH_GRPBY_OVERFLOWS) AS HASH_GRPBY_OVERFLOWS
925 FROM TABLE(MON_GET_DATABASE(-2))
926 `
927 querySimplePctTimeQueued = `
928 SELECT
929 CASE
930 WHEN SUM(TOTAL_RQST_TIME) > 0
931 THEN (SUM(WLM_QUEUE_TIME_TOTAL) * 100.0) / SUM(TOTAL_RQST_TIME)
932 ELSE 0
933 END AS PCT_TIME_QUEUED
934 FROM TABLE(MON_GET_SERVICE_SUBCLASS(NULL, NULL, -2))
935 `
936
937 // Screen 15: Prefetchers queries
938 // Uses simple individual queries from dcmtop
939 queryPrefetcherMetrics = `
940 SELECT
941 BP_NAME AS BUFFERPOOL_NAME,
942 CASE
943 WHEN (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS +
944 POOL_COL_P_READS + POOL_TEMP_DATA_P_READS + POOL_TEMP_INDEX_P_READS +
945 POOL_TEMP_XDA_P_READS + POOL_TEMP_COL_P_READS) > 0
946 THEN DECIMAL((POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS +
947 POOL_ASYNC_XDA_READS + POOL_ASYNC_COL_READS) * 100.0 /
948 (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS +
949 POOL_COL_P_READS + POOL_TEMP_DATA_P_READS + POOL_TEMP_INDEX_P_READS +
950 POOL_TEMP_XDA_P_READS + POOL_TEMP_COL_P_READS), 5, 2)
951 ELSE 0.00
952 END AS PREFETCH_RATIO_PCT,
953 CASE
954 WHEN (POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES + POOL_COL_WRITES) > 0
955 THEN DECIMAL((POOL_ASYNC_DATA_WRITES + POOL_ASYNC_INDEX_WRITES +
956 POOL_ASYNC_XDA_WRITES + POOL_ASYNC_COL_WRITES) * 100.0 /
957 (POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES + POOL_COL_WRITES), 5, 2)
958 ELSE 0.00
959 END AS CLEANER_RATIO_PCT,
960 (POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS + POOL_COL_P_READS +
961 POOL_TEMP_DATA_P_READS + POOL_TEMP_INDEX_P_READS + POOL_TEMP_XDA_P_READS +
962 POOL_TEMP_COL_P_READS) AS PHYSICAL_READS,
963 (POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS + POOL_ASYNC_XDA_READS +
964 POOL_ASYNC_COL_READS) AS ASYNCHRONOUS_READS,
965 CASE
966 WHEN PREFETCH_WAITS > 0
967 THEN DECIMAL(PREFETCH_WAIT_TIME / PREFETCH_WAITS, 10, 2)
968 ELSE 0.00
969 END AS PREFETCH_WAITS_TIME_MS,
970 UNREAD_PREFETCH_PAGES
971 FROM TABLE(MON_GET_BUFFERPOOL('', -2))
972 ORDER BY BP_NAME`
973
974 // SNAP-based simple queries for older DB2 versions
975 // These are fallback queries when MON_GET functions are not available
976
977 // Database status from SNAP
978 querySnapDatabaseStatus = `SELECT DB_STATUS AS DATABASE_STATUS FROM SYSIBMADM.SNAPDB FETCH FIRST 1 ROW ONLY`
979
980 // Connection metrics from SNAP
981 querySnapConnectionsActive = `SELECT COUNT(*) AS ACTIVE_CONNECTIONS FROM SYSIBMADM.APPLICATIONS WHERE APPL_STATUS = 'CONNECTED'`
982 querySnapConnectionsTotal = `SELECT COUNT(*) AS TOTAL_CONNECTIONS FROM SYSIBMADM.APPLICATIONS`
983
984 // Throughput from SNAP
985 querySnapTransactions = `SELECT SUM(TOTAL_APP_COMMITS + INT_COMMITS + TOTAL_APP_ROLLBACKS + INT_ROLLBACKS) AS TRANSACTIONS FROM SYSIBMADM.SNAPDB`
986 querySnapSelectStmts = `SELECT SUM(SELECT_SQL_STMTS) AS SELECT_STMTS FROM SYSIBMADM.SNAPDB`
987 querySnapUIDStmts = `SELECT SUM(UID_SQL_STMTS) AS UID_STMTS FROM SYSIBMADM.SNAPDB`
988 querySnapLogReads = `SELECT SUM(LOG_READS) AS LOG_READS FROM SYSIBMADM.SNAPDB`
989 querySnapLogWrites = `SELECT SUM(LOG_WRITES) AS LOG_WRITES FROM SYSIBMADM.SNAPDB`
990 querySnapLogicalReads = `SELECT SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_XDA_L_READS) AS LOGICAL_READS FROM SYSIBMADM.SNAPBP`
991 querySnapPhysicalReads = `SELECT SUM(POOL_DATA_P_READS + POOL_INDEX_P_READS + POOL_XDA_P_READS) AS PHYSICAL_READS FROM SYSIBMADM.SNAPBP`
992 querySnapAsyncReads = `SELECT SUM(POOL_ASYNC_DATA_READS + POOL_ASYNC_INDEX_READS + POOL_ASYNC_XDA_READS) AS ASYNC_READS FROM SYSIBMADM.SNAPBP`
993 querySnapWrites = `SELECT SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES + POOL_XDA_WRITES) AS WRITES FROM SYSIBMADM.SNAPBP`
994 querySnapAsyncWrites = `SELECT SUM(POOL_ASYNC_DATA_WRITES + POOL_ASYNC_INDEX_WRITES + POOL_ASYNC_XDA_WRITES) AS ASYNC_WRITES FROM SYSIBMADM.SNAPBP`
995
996 // Lock metrics from SNAP
997 querySnapLockHeld = `SELECT SUM(LOCKS_HELD) AS LOCKS_HELD FROM SYSIBMADM.SNAPDB`
998 querySnapLockWaits = `SELECT SUM(LOCK_WAITS) AS LOCK_WAITS FROM SYSIBMADM.SNAPDB`
999 querySnapLockTimeouts = `SELECT SUM(LOCK_TIMEOUTS) AS LOCK_TIMEOUTS FROM SYSIBMADM.SNAPDB`
1000 querySnapLockEscalations = `SELECT SUM(LOCK_ESCALS) AS LOCK_ESCALATIONS FROM SYSIBMADM.SNAPDB`
1001 querySnapDeadlocks = `SELECT SUM(DEADLOCKS) AS DEADLOCKS FROM SYSIBMADM.SNAPDB`
1002
1003 // Time spent from SNAP
1004 querySnapAvgPoolReadTime = `
1005 SELECT
1006 CASE
1007 WHEN SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS) > 0
1008 THEN SUM(POOL_READ_TIME) / SUM(POOL_DATA_L_READS + POOL_INDEX_L_READS)
1009 ELSE 0
1010 END AS AVG_POOL_READ_TIME
1011 FROM SYSIBMADM.SNAPBP
1012 `
1013 querySnapAvgDirectReadTime = `
1014 SELECT
1015 CASE
1016 WHEN SUM(DIRECT_READS) > 0
1017 THEN SUM(DIRECT_READ_TIME) / SUM(DIRECT_READS)
1018 ELSE 0
1019 END AS AVG_DIRECT_READ_TIME
1020 FROM SYSIBMADM.SNAPDB
1021 `
1022 querySnapAvgPoolWriteTime = `
1023 SELECT
1024 CASE
1025 WHEN SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES) > 0
1026 THEN SUM(POOL_WRITE_TIME) / SUM(POOL_DATA_WRITES + POOL_INDEX_WRITES)
1027 ELSE 0
1028 END AS AVG_POOL_WRITE_TIME
1029 FROM SYSIBMADM.SNAPBP
1030 `
1031 querySnapAvgDirectWriteTime = `
1032 SELECT
1033 CASE
1034 WHEN SUM(DIRECT_WRITES) > 0
1035 THEN SUM(DIRECT_WRITE_TIME) / SUM(DIRECT_WRITES)
1036 ELSE 0
1037 END AS AVG_DIRECT_WRITE_TIME
1038 FROM SYSIBMADM.SNAPDB
1039 `
1040 querySnapSorts = `SELECT SUM(TOTAL_SORTS) AS SORTS FROM SYSIBMADM.SNAPDB`
1041 querySnapSortOverflows = `SELECT SUM(SORT_OVERFLOWS) AS SORT_OVERFLOWS FROM SYSIBMADM.SNAPDB`
1042 )