1
+
2
+ export function getIndexesStatement ( schema : string , name : string ) {
3
+ return `
4
+ --
5
+ with X as (
6
+ select max(INDEX_NAME) NAME, SYSTEM_INDEX_NAME SYSNAME, max(INDEX_SCHEMA) SCHEMA,
7
+ SYSTEM_INDEX_SCHEMA SYSSCHEMA,
8
+ case count(distinct INDEX_PARTITION)
9
+ when 1 then max(INDEX_PARTITION)
10
+ else NULL
11
+ end PARTITION, max(INDEX_TYPE) TYPE, max(INDEX_OWNER) OWNER, max(INDEX_VALID) VALID,
12
+ min(CREATE_TIMESTAMP) CREATED, max(LAST_BUILD_TIMESTAMP) BUILT, max(LAST_QUERY_USE) LQU,
13
+ max(LAST_STATISTICS_USE) LSU, sum(QUERY_USE_COUNT) QUC, sum(QUERY_STATISTICS_COUNT) QSC,
14
+ max(LAST_USED_TIMESTAMP) USED, max(DAYS_USED_COUNT) DUC, max(LAST_RESET_TIMESTAMP) RESET,
15
+ max(NUMBER_KEYS) KEYS, max(INDEX_SIZE) SIZE, max(NUMBER_PAGES) PAGES,
16
+ max(LOGICAL_PAGE_SIZE) PAGESIZE, max(UNIQUE) UNIQUE, max(MAXIMUM_KEY_LENGTH) MAXKEYLEN,
17
+ max(NUMBER_KEY_COLUMNS) KEYCOLCOUNT, max(COLUMN_NAMES) COLUMNS,
18
+ max(UNIQUE_PARTIAL_KEY_VALUES) UPKV, max(OVERFLOW_VALUES) OVERFLOW,
19
+ max(EVI_CODE_SIZE) EVISIZE, max(SPARSE) SPARSE, max(DERIVED_KEY) DERIVEDKEY,
20
+ max(PARTITIONED) PARTITIONED, max(ACCPTH_TYPE) ACCPTHTYPE, max(SORT_SEQUENCE) SORTSEQ,
21
+ max(LANGUAGE_IDENTIFIER) LANGID, max(ESTIMATED_BUILD_TIME) ESTBUILDTIME,
22
+ max(INDEX_HELD) HELD, max(MAINTENANCE) MAINTENANCE,
23
+ max(DELAYED_MAINT_KEYS) DELAYEDMAINTKEYS, max(RECOVERY) RECOVERY,
24
+ max(LOGICAL_READS) LOGICALREADS, 0 PHYSICALREADS, max(INDEX_TEXT) TEXT,
25
+ max(SEARCH_CONDITION) SEARCHCOND, max(SEARCH_CONDITION_HAS_UDF) SEARCHCONDHASUDF,
26
+ case
27
+ when max(TABLE_NAME) = min(TABLE_NAME) then max(TABLE_NAME)
28
+ else NULL
29
+ end TABNAME,
30
+ case
31
+ when max(SYSTEM_TABLE_SCHEMA) = min(SYSTEM_TABLE_SCHEMA) then max(SYSTEM_TABLE_SCHEMA)
32
+ else NULL
33
+ end SYSTABSCHEMA,
34
+ case
35
+ when max(TABLE_PARTITION) = min(TABLE_PARTITION) then max(TABLE_PARTITION)
36
+ else NULL
37
+ end TABPART,
38
+ case
39
+ when max(SYSTEM_TABLE_NAME) = min(SYSTEM_TABLE_NAME) then max(SYSTEM_TABLE_NAME)
40
+ else NULL
41
+ end SYSTABNAME, max(TABLE_SCHEMA) TABSCHEMA, max(SORT_SEQUENCE_NAME) SORTSEQNAME,
42
+ max(SORT_SEQUENCE_SCHEMA) SORTSEQSCHEMA, max(MEDIA_PREFERENCE) MEDIAPREF,
43
+ max(KEEP_IN_MEMORY) KIM, sum(RANDOM_READS) RANDOMREADS,
44
+ max(LAST_BUILD_TIME) LASTBUILDTIME, max(LAST_BUILD_KEYS) LASTBUILDKEYS,
45
+ max(LAST_BUILD_DEGREE) LASTBUILDDEGREE, sum(SEQUENTIAL_READS) SEQREADS,
46
+ max(INCLUDE_EXPRESSION) INCEXPR,
47
+ case
48
+ when max(PARTITIONED) = 'YES' then count(*)
49
+ else 1
50
+ end IDXCOUNT
51
+ from QSYS2.SYSPARTITIONINDEXES
52
+ where
53
+
54
+ TABLE_SCHEMA = '${ schema } ' and
55
+ TABLE_NAME = '${ name } ' and
56
+
57
+ INDEX_NAME not like '%MAINTAINED TEMPORARY INDEXES%'
58
+ group by SYSTEM_INDEX_SCHEMA, INDEX_NAME, SYSTEM_INDEX_NAME
59
+ union all
60
+ select MTI_NAME, cast(null as char(10)), cast(null as varchar(128)), cast(null as char(10)), cast(null as varchar(128)),
61
+ 'TEMPORARY', 'SQL QUERY ENGINE', case state when 'VALID' then 'YES' else 'NO' end,
62
+ CREATE_TIME, LAST_BUILD_START_TIME, cast(null as timestamp), cast(null as timestamp),
63
+ cast(null as bigint), cast(null as bigint), cast(null as timestamp),
64
+ cast(null as integer), cast(null as timestamp), KEYS, MTI_SIZE, cast(null as bigint),
65
+ cast(null as integer), cast(null as varchar(21)), cast(null as integer), KEYS,
66
+ varchar(KEY_DEFINITION, 1024), cast(null as varchar(96)), cast(null as integer), cast(null as integer),
67
+ SPARSE, cast(null as varchar(3)), cast(null as varchar(20)), cast(null as varchar(4)),
68
+ cast(null as varchar(12)), cast(null as char(3)), case when LAST_BUILD_START_TIME is not null
69
+ and LAST_BUILD_END_TIME is not null then
70
+ integer(timestampdiff_big(2, cast(LAST_BUILD_END_TIME - LAST_BUILD_START_TIME as char(22))))
71
+ else cast(null as integer) end, cast(null as varchar(3)), cast(null as varchar(11)),
72
+ cast(null as integer), cast(null as varchar(10)), cast(null as bigint), cast(null as integer),
73
+ cast(null as vargraphic(50)), cast(null as vargraphic(1024)), cast(null as varchar(3)),
74
+ TABLE_NAME, LIBRARY_NAME, cast(null as varchar(128)), cast(null as char(10)), TABLE_SCHEMA,
75
+ cast(null as char(10)), cast(null as char(10)), cast(null as varchar(3)), cast(null as varchar(3)),
76
+ cast(null as bigint), case when LAST_BUILD_START_TIME is not null
77
+ and LAST_BUILD_END_TIME is not null then
78
+ integer(timestampdiff_big(2, cast(LAST_BUILD_END_TIME - LAST_BUILD_START_TIME as char(22))))
79
+ else cast(null as integer) end, cast(null as bigint), cast(null as smallint),
80
+ cast(null as bigint), cast(null as vargraphic(1024)), cast(null as integer)
81
+ from table (
82
+ qsys2.mti_info(TABLE_SCHEMA => '${ schema } ', TABLE_NAME => '${ name } ')
83
+ )
84
+ )
85
+ select QSYS2.DELIMIT_NAME(NAME) "Index Name",
86
+ case TYPE
87
+ when 'INDEX' then 'Index'
88
+ when 'LOGICAL' then 'Keyed Logical File'
89
+ when 'PHYSICAL' then 'Keyed Physical File'
90
+ when 'PRIMARY KEY' then 'Primary Key Constraint'
91
+ when 'UNIQUE' then 'Unique Key Constraint'
92
+ when 'FOREIGN KEY' then 'Foreign Key Constraint'
93
+ when 'TEMPORARY' then 'Temporary Index'
94
+ else cast(TYPE as varchar(11))
95
+ end "Type",
96
+ COLUMNS "Key Columns",
97
+ trim(VARCHAR_FORMAT(SIZE, '999G999G999G999G999')) "Size",
98
+ case VALID
99
+ when 'YES' then 'Yes'
100
+ when 'NO' then 'No'
101
+ else cast(VALID as varchar(3))
102
+ end "Valid",
103
+ OWNER "Owner",
104
+ VARCHAR_FORMAT(CREATED, 'MM/DD/YYYY HH:MI:SS AM') "Date Created",
105
+ VARCHAR_FORMAT(BUILT, 'MM/DD/YYYY HH:MI:SS AM') "Last Build",
106
+ case
107
+ when PARTITION is NULL then ''
108
+ else QSYS2.DELIMIT_NAME(PARTITION)
109
+ end "Partition",
110
+ VARCHAR_FORMAT(LQU, 'MM/DD/YYYY HH:MI:SS AM') "Last Query Use",
111
+ VARCHAR_FORMAT(LSU, 'MM/DD/YYYY HH:MI:SS AM') "Last Query Statistics Use",
112
+ trim(VARCHAR_FORMAT(QUC, '999G999G999G999G999')) "Query Use Count",
113
+ trim(VARCHAR_FORMAT(QSC, '999G999G999G999G999')) "Query Statistics Use Count",
114
+ VARCHAR_FORMAT(USED, 'MM/DD/YYYY HH:MI:SS AM') "Last Used",
115
+ trim(VARCHAR_FORMAT(DUC, '999G999G999G999G999')) "Days Used Count",
116
+ VARCHAR_FORMAT(RESET, 'MM/DD/YYYY') "Days Used Count Reset Date",
117
+ ACCPTHTYPE "Maximum Size",
118
+ case
119
+ when UNIQUE is NULL then ''
120
+ when UNIQUE = 'UNIQUE' then 'Unique'
121
+ when UNIQUE = 'UNIQUE WHERE NOT NULL' then 'Unique where not null'
122
+ else cast(UNIQUE as varchar(21))
123
+ end "Duplicate Key Order",
124
+ trim(VARCHAR_FORMAT(PAGESIZE, '999G999G999G999G999')) "Logical Page Size",
125
+ case
126
+ when EVISIZE is NULL then ''
127
+ when EVISIZE = 1 then '255'
128
+ when EVISIZE = 2 then '65,535'
129
+ when EVISIZE = 4 then '2,147,483,647'
130
+ else cast(EVISIZE as varchar(128))
131
+ end "EVI Distinct Values",
132
+ case SORTSEQ
133
+ when 'BY HEX VALUE' then 'By hex value'
134
+ else cast(SORTSEQ as varchar(12))
135
+ end "Sort Sequence", LANGID "Language Identifier",
136
+ case
137
+ when PARTITIONED is NULL then ''
138
+ when PARTITIONED = 'NO' then 'Yes'
139
+ when PARTITIONED = 'YES' then 'No'
140
+ else cast(PARTITIONED as varchar(20))
141
+ end "Spanning",
142
+ case KIM
143
+ when 'YES' then 'Yes'
144
+ when 'NO' then 'No'
145
+ else cast(KIM as varchar(3))
146
+ end "Keep in Memory",
147
+ case MEDIAPREF
148
+ when 'ANY' then 'Any'
149
+ else cast(MEDIAPREF as varchar(3))
150
+ end "Media Preference", RANDOMREADS "Random Reads", SEQREADS "Sequential Reads",
151
+ ESTBUILDTIME "Estimated Rebuild Time", LASTBUILDTIME "Last Rebuild Time",
152
+ KEYS "Current Key Values", LASTBUILDKEYS "Last Rebuild Key Count",
153
+ LASTBUILDDEGREE "Last Rebuild Parallel Degree",
154
+ case
155
+ when TABNAME is NULL then NULL
156
+ else QSYS2.DELIMIT_NAME(TABNAME)
157
+ end "Table Name", SYSTABNAME "Table System Name",
158
+ case
159
+ when TABSCHEMA is NULL then NULL
160
+ else QSYS2.DELIMIT_NAME(TABSCHEMA)
161
+ end "Table Schema", SYSTABSCHEMA "Table System Schema", TABPART "Table Partition",
162
+ trim(VARCHAR_FORMAT(PAGES, '999G999G999G999G999')) "Current Allocated Pages",
163
+ DELAYEDMAINTKEYS "Delayed Maintenance Keys",
164
+ case DERIVEDKEY
165
+ when 'YES' then 'Yes'
166
+ when 'NO' then 'No'
167
+ else cast(DERIVEDKEY as varchar(3))
168
+ end "Derived Key",
169
+ case HELD
170
+ when 'YES' then 'Yes'
171
+ when 'NO' then 'No'
172
+ else cast(HELD as varchar(3))
173
+ end "Held",
174
+ case INCEXPR
175
+ when 'YES' then 'Yes'
176
+ when 'NO' then 'No'
177
+ else cast(INCEXPR as varchar(3))
178
+ end "INCLUDE Expression", LOGICALREADS "Index Logical Reads",
179
+ case
180
+ when MAINTENANCE is NULL then ''
181
+ when MAINTENANCE = 'REBUILD' then 'Rebuild'
182
+ when MAINTENANCE = 'DELAYED' then 'Delayed'
183
+ when MAINTENANCE = 'DO NOT WAIT' then 'Do not wait'
184
+ else cast(MAINTENANCE as varchar(11))
185
+ end "Maintenance", MAXKEYLEN "Maximum Key Length", KEYCOLCOUNT "Key Column Count",
186
+ OVERFLOW "Overflow Values",
187
+ case
188
+ when RECOVERY is NULL then ''
189
+ when RECOVERY = 'AFTER IPL' then 'After IPL'
190
+ when RECOVERY = 'DURING IPL' then 'During IPL'
191
+ when RECOVERY = 'NEXT OPEN' then 'Next open'
192
+ else cast(RECOVERY as varchar(10))
193
+ end "Recovery", SORTSEQNAME "Sort Sequence Name", SORTSEQSCHEMA "Sort Sequence Schema",
194
+ case SPARSE
195
+ when 'YES' then 'Yes'
196
+ when 'NO' then 'No'
197
+ else cast(SPARSE as varchar(3))
198
+ end "Sparse", UPKV "Unique Partial Key Values", SEARCHCOND "WHERE Clause",
199
+ SEARCHCONDHASUDF "WHERE Clause Has UDF",
200
+ case
201
+ when TEXT is NULL then ''
202
+ else trim(TEXT)
203
+ end "Text",
204
+ SYSNAME "Index System Name",
205
+ case
206
+ when SCHEMA is NULL then NULL
207
+ else QSYS2.DELIMIT_NAME(SCHEMA)
208
+ end "Schema", SYSSCHEMA "System Schema"
209
+
210
+ from X
211
+ order by 1 asc
212
+ ` ;
213
+ }
214
+
1
215
export function getAdvisedIndexesStatement ( schema : string , name ?: string ) {
2
216
return [
3
217
`select KEY_COLUMNS_ADVISED, Times_Advised, Most_Expensive_Query, Average_Query_Estimate,` ,
@@ -10,4 +224,14 @@ export function getAdvisedIndexesStatement(schema: string, name?: string) {
10
224
` Table_Schema = '${ schema } '` ,
11
225
` order by Times_Advised desc` ,
12
226
] . join ( ` ` ) ;
227
+ }
228
+
229
+ export function getMTIStatement ( schema : string , table : string = `*ALL` ) {
230
+ return [
231
+ `select * ` ,
232
+ `from table (` ,
233
+ ` qsys2.mti_info(TABLE_SCHEMA => '${ schema } ', TABLE_NAME => '${ table } ')` ,
234
+ `)` ,
235
+ `order by key_definition` ,
236
+ ] . join ( ` ` ) ;
13
237
}
0 commit comments