为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
参考文档
如何通过 SQL 快速获取表、注释、索引定义
https://eco.dameng.com/document/dm/zh-cn/faq/faq-sql-gramm.html#%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20SQL%20%E5%BF%AB%E9%80%9F%E8%8E%B7%E5%8F%96%E8%A1%A8%E3%80%81%E6%B3%A8%E9%87%8A%E3%80%81%E7%B4%A2%E5%BC%95%E5%AE%9A%E4%B9%89
其中最后有这个没看明白,在管理工具里可以执行,在DISQL工具里会提示input 0x01
and idx.flag & 0x01 = 0
&表示二进制里面的位与操作。
disql 需要先屏蔽变量&标识符
set define off;
关于 sysindexes 表中 flag 字段的用法,你可以参考下下面这个SQL。
另外,在disql中,如果要执行的SQL中有 & 符号,且不是用作变量值输入需要的话,需要在执行SQL前通过 SET DEFINE OFF 指令关闭本地变量定义参数。
WITH T_IDX AS ( SELECT USR.NAME AS USER_NAME --表宿主用户名 ,SCH.NAME AS SCHEMA_NAME --表所在模式名 ,TAB.NAME AS TABLE_NAME --表名 ,IDX.NAME AS INDEX_NAME --索引名 ,DECODE(IDXINFO.FLAG,1,'Y',9,'Y','N') AS GENERATED --是否为系统自动生成的索引 ,DECODE(IDXINFO.TYPE$,'BT','B 树','BM','位图','ST','空间','AR','数组') AS INDEX_TYPE --索引类型 ,RTRIM( DECODE(IDXINFO.FLAG & 0x01,0x00,'正常索引;') ||DECODE(IDXINFO.FLAG & 0x01,0x01,'系统索引;') ||DECODE(IDXINFO.FLAG & 0x02,0x02,'虚索引(VIRTUAL);') ||DECODE(IDXINFO.FLAG & 0x04,0x04,'主键;') ||DECODE(IDXINFO.FLAG & 0x08,0x08,'在临时表上;') ||DECODE(IDXINFO.FLAG & 0x10,0x10,'无效索引;') ||DECODE(IDXINFO.FLAG & 0x20,0x20,'fast pool;') ||DECODE(IDXINFO.XTYPE & 0x01,0x00,CASE WHEN (TAB.INFO3 & 0x3F) IN (0x13, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27) THEN 'HUGE表聚集索引(HUGE CLUSTER);' ELSE '聚集索引(CLUSTER);' END) ||DECODE(IDXINFO.XTYPE & 0x01,0x01,'二级索引;') ||DECODE(IDXINFO.XTYPE & 0x02,0x02,'函数索引(FUNCTION-BASED NORMAL);') ||DECODE(IDXINFO.XTYPE & 0x04,0x04,'全局索引在水平分区子表上;') ||DECODE(IDXINFO.XTYPE & 0x08,0x08,'全局索引在水平分区主表上;') ||DECODE(IDXINFO.XTYPE & 0x10,0x10,'唯一索引;') ||DECODE(IDXINFO.XTYPE & 0x20,0x20,'扁平索引(FLAT);') ||DECODE(IDXINFO.XTYPE & 0x40,0x40,'数组索引;') ||DECODE(IDXINFO.XTYPE & 0x800,0x800,'该位图索引是由改造后创建;') ||DECODE(IDXINFO.XTYPE & 0x1000,0x1000,'位图索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x2000,0x2000,'位图连接索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x4000,0x4000,'位图连接索引虚索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x8000,0x8000,'空间索引;') ||DECODE(IDXINFO.XTYPE & 0x10000,0x00,'','索引不可见;') ,';') AS INDEX_EXTINFO --索引扩展属性 ,DECODE(IDX.VALID,'Y','USABLE','UNUSABLE') AS INDEX_STATUS --索引可用状态 ,DECODE(IDXINFO.ISUNIQUE,'Y','UNIQUE','NONUNIQUE') AS UNIQUENESS --是否唯一索引 ,CONS.NAME AS CONSTRAINT_NAME --索引关联约束名称 ,DECODE(CONSINFO.TYPE$,'P','主键约束','U','唯一性约束','F','引用约束','C','检查约束') AS CONSTRAINT_TYPE --索引关联约束类别 ,CASE WHEN IDXINFO.KEYNUM = 0 AND IDXINFO.FLAG & 0x01 = 0x01 AND IDXINFO.XTYPE & 0x01 = 0x00 THEN 'ROWID' ELSE DECODE(IDXINFO.XTYPE & 0x02,0x02,REPLACE(FBI_DEF(IDX.ID),' ',' DESC') ,(SELECT LISTAGG(COL.NAME || DECODE(SF_GET_INDEX_KEY_ORDER(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID),'D',' DESC'),',') WITHIN GROUP (ORDER BY SF_GET_INDEX_KEY_SEQ(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID)) FROM SYSCOLUMNS COL WHERE COL.ID = TAB.ID AND SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) = 1 ) ) END AS INDEX_COLS --索引字段列表 ,CASE WHEN CONSINFO.TYPE$ = 'F' THEN REFDEF(IDX.ID,1) WHEN CONS.ID IS NOT NULL THEN CONSDEF(IDX.ID,1) ELSE INDEXDEF(IDX.ID,1) END AS INDEX_DDL --索引创建用DDL语句 FROM DUAL LEFT JOIN SYSOBJECTS TAB ON TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('STAB','UTAB') LEFT JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID LEFT JOIN SYSOBJECTS USR ON USR.TYPE$ = 'UR' AND USR.SUBTYPE$ = 'USER' AND USR.ID = SCH.PID LEFT JOIN SYSOBJECTS IDX ON IDX.TYPE$ = 'TABOBJ' AND IDX.SUBTYPE$ = 'INDEX' AND IDX.PID = TAB.ID LEFT JOIN SYSINDEXES IDXINFO ON IDX.ID = IDXINFO.ID LEFT JOIN SYSCONS CONSINFO ON CONSINFO.INDEXID = IDXINFO.ID AND CONSINFO.TABLEID = IDX.PID LEFT JOIN SYSOBJECTS CONS ON CONS.TYPE$ = 'TABOBJ' AND CONS.SUBTYPE$ = 'CONS' AND CONS.ID = CONSINFO.ID LEFT JOIN SYSOBJECTS PAR ON PAR.TYPE$ = 'TABOBJ' AND PAR.SUBTYPE$ = 'INDEX' AND PAR.ID = IDX.INFO4 LEFT JOIN V$TABLESPACE TS ON TS.ID = IDXINFO.GROUPID LEFT JOIN V$HUGE_TABLESPACE HTS ON HTS.ID = IDXINFO.GROUPID ) SELECT * FROM T_IDX WHERE INDEX_NAME = 'INDEX33555693'