Skip to content

Commit d79e619

Browse files
committed
Merge branch 'main' into feature/improved_filter
Signed-off-by: worksofliam <[email protected]>
2 parents 1d8353a + 9ab82b8 commit d79e619

File tree

3 files changed

+250
-2
lines changed

3 files changed

+250
-2
lines changed

package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,11 @@
417417
"title": "Get Related Objects",
418418
"category": "Db2 for i"
419419
},
420+
{
421+
"command": "vscode-db2i.getMTIs",
422+
"title": "Get MTIs",
423+
"category": "Db2 for i"
424+
},
420425
{
421426
"command": "vscode-db2i.getIndexes",
422427
"title": "Get Indexes",
@@ -974,6 +979,11 @@
974979
"when": "viewItem == table",
975980
"group": "db2workWith@2"
976981
},
982+
{
983+
"command": "vscode-db2i.getMTIs",
984+
"when": "viewItem == table || viewItem == schema",
985+
"group": "db2workWith@3"
986+
},
977987
{
978988
"command": "vscode-db2i.clearData",
979989
"when": "viewItem == table",

src/views/schemaBrowser/schemaBrowser.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Configuration from "../../configuration";
1010
import Types from "../types";
1111
import Statement from "../../database/statement";
1212
import { copyUI } from "./copyUI";
13-
import { getAdvisedIndexesStatement } from "./statements";
13+
import { getAdvisedIndexesStatement, getIndexesStatement, getMTIStatement } from "./statements";
1414

1515
const viewItem = {
1616
"tables": `table`,
@@ -160,9 +160,23 @@ export default class schemaBrowser {
160160
}
161161
}),
162162

163+
vscode.commands.registerCommand(`vscode-db2i.getMTIs`, async (object: SQLObject|SchemaItem) => {
164+
if (object) {
165+
const content = getMTIStatement(object.schema, (`name` in object ? object.name : undefined));
166+
167+
if (content) {
168+
vscode.commands.executeCommand(`vscode-db2i.runEditorStatement`, {
169+
content,
170+
qualifier: `statement`,
171+
open: false,
172+
});
173+
}
174+
}
175+
}),
176+
163177
vscode.commands.registerCommand(`vscode-db2i.getIndexes`, async (object: SQLObject) => {
164178
if (object) {
165-
const content = `SELECT * FROM QSYS2.SYSINDEXSTAT WHERE TABLE_SCHEMA = '${object.schema}' and TABLE_NAME = '${object.name}'`;
179+
const content = getIndexesStatement(object.schema, object.name);
166180
vscode.commands.executeCommand(`vscode-db2i.runEditorStatement`, {
167181
content,
168182
qualifier: `statement`,

src/views/schemaBrowser/statements.ts

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,217 @@
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+
1215
export function getAdvisedIndexesStatement(schema: string, name?: string) {
2216
return [
3217
`select KEY_COLUMNS_ADVISED, Times_Advised, Most_Expensive_Query, Average_Query_Estimate,`,
@@ -10,4 +224,14 @@ export function getAdvisedIndexesStatement(schema: string, name?: string) {
10224
` Table_Schema = '${schema}'`,
11225
` order by Times_Advised desc`,
12226
].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(` `);
13237
}

0 commit comments

Comments
 (0)