获取 DB2 上的索引列

问题描述 投票:0回答:5

在 DB2 中如何获取表索引使用的列?

我尝试过:

DESCRIBE INDEXES FOR TABLE 'MYTABLE' SHOW DETAIL;

但是我收到错误消息

非法符号“索引”。一些可能合法的符号是: 程序 PROC。 SQLCODE=-104,SQLSTATE=42601,驱动程序=4.16.53

理想情况下,我想要表使用的所有索引及其相应列的信息。

我正在使用 DB2 for z/OS V9.1

sql indexing db2
5个回答
6
投票

您可以使用此查询来显示表的索引及其列:

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; 

1
投票
SELECT * FROM SYSIBM.SYSKEYS WHERE IXNAME IN 
(SELECT NAME FROM SYSIBM.SYSINDEXES WHERE TBNAME = 'your_table_name') 

我已经测试过它,它为我们提供了索引中使用的所有列。


1
投票

您也可以使用以下查询。如果 syskeys 表丢失,它可以正常工作

SELECT * FROM SYSIBM.SYSINDEXCOLUSE where INDNAME IN (SELECT NAME FROM SYSIBM.SYSINDEXES si where si.TBNAME ='your_table_Name') ORDER BY INDNAME, COLSEQ


0
投票

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 不一定相同。这就是为什么我输出这些以及名称。


-1
投票

我在使用“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
© www.soinside.com 2019 - 2024. All rights reserved.