在 DB2 中如何获取表索引使用的列?
我尝试过:
DESCRIBE INDEXES FOR TABLE 'MYTABLE' SHOW DETAIL;
但是我收到错误消息
非法符号“索引”。一些可能合法的符号是: 程序 PROC。 SQLCODE=-104,SQLSTATE=42601,驱动程序=4.16.53
理想情况下,我想要表使用的所有索引及其相应列的信息。
我正在使用 DB2 for z/OS V9.1
您可以使用此查询来显示表的索引及其列:
SELECT IX.tbname,
KEY.ixname,
KEY.colname
FROM sysibm.syskeys KEY
JOIN sysibm.sysindexes IX
ON KEY.ixname = IX.name
WHERE IX.tbname IN ( 'SOMETABLE', 'ANOTHERTABLE' )
ORDER BY IX.tbname,
KEY.ixname,
KEY.colname;
SELECT * FROM SYSIBM.SYSKEYS WHERE IXNAME IN
(SELECT NAME FROM SYSIBM.SYSINDEXES WHERE TBNAME = 'your_table_name')
我已经测试过它,它为我们提供了索引中使用的所有列。
您也可以使用以下查询。如果 syskeys 表丢失,它可以正常工作
SELECT * FROM SYSIBM.SYSINDEXCOLUSE where INDNAME IN (SELECT NAME FROM SYSIBM.SYSINDEXES si where si.TBNAME ='your_table_Name') ORDER BY INDNAME, COLSEQ
Uooo的回答并不完全正确。您需要将
CREATOR
添加到 JOIN。这是我用来为我们的项目获取相同类型信息的版本。
SELECT IX.TBNAME,
IX.TBCREATOR,
IX.NAME,
IX.CREATOR,
KEY.COLNAME,
KEY.COLSEQ
FROM SYSIBM.SYSKEYS KEY
JOIN SYSIBM.SYSINDEXES IX
ON (KEY.IXNAME = IX.NAME AND KEY.IXCREATOR = IX.CREATOR)
WHERE IX.TBNAME IN ('EXPLAIN_TABLE',
'STATISTIC_TABLE',
'STATEMENT_TABLE',
'DSN_FILTER_TABLE',
'PLAN_TABLE', 'DSN_PREDICAT_TABLE')
AND IX.CREATOR = 'myschema'
ORDER BY IX.TBNAME,
IX.NAME,
KEY.COLSEQ;
还要注意,表和索引的 CREATOR 不一定相同。这就是为什么我输出这些以及名称。
我在使用“KEY”作为表别名时遇到问题。另外,如果您有多个具有相同表名的模式,请使用以下命令:
SELECT IX.TABLE_SCHEMA, IX.TABLE_NAME, IX.INDEX_NAME, KY.ORDINAL_POSITION, KY.COLUMN_NAME
FROM SYSKEYS KY
JOIN SYSINDEXES IX ON (KY.INDEX_NAME = IX.INDEX_NAME AND KY.INDEX_SCHEMA = IX.INDEX_SCHEMA)
WHERE IX.TBNAME = 'table-name' AND IX.TABLE_SCHEMA = 'table-schema'
ORDER BY IX.TABLE_SCHEMA, IX.TABLE_NAME, IX.INDEX_NAME, KY.ORDINAL_POSITION
FOR READ ONLY WITH UR