我如何找出在 oracle 数据字典表本身(例如,在 all_tables 或 all_source 的列上)设置的索引(如果有)?
问问题
1972 次
2 回答
3
ALL_TABLES 和 ALL_SOURCE 实际上是视图。如果您有权限,您可以查看它们的来源:
SQL> select text from all_views where view_name='ALL_TABLES';
TEXT
--------------------------------------------------------------------------------
select u.name, o.name,decode(bitand(t.property, 2151678048), 0, ts.name, null),
decode(bitand(t.property, 1024), 0, null, co.name),
decode((bitand(t.property, 512)+bitand(t.flags, 536870912)),
0, null, co.name),
decode(bitand(t.trigflag, 1073741824), 1073741824, 'UNUSABLE', 'VALID'),
decode(bitand(t.property, 32+64), 0, mod(t.pctfree$, 100), 64, 0, null),
decode(bitand(ts.flags, 32), 32, to_number(NULL),
decode(bitand(t.property, 32+64), 0, t.pctused$, 64, 0, null)),
decode(bitand(t.property, 32), 0, t.initrans, null),
decode(bitand(t.property, 32), 0, t.maxtrans, null),
s.iniexts * ts.blocksize,
decode(bitand(ts.flags, 3), 1, to_number(NULL),
s.extsize * ts.blocksize),
s.minexts, s.maxexts,
decode(bitand(ts.flags, 3), 1, to_number(NULL),
s.extpct),
decode(bitand(ts.flags, 32), 32, to_number(NULL),
decode(bitand(o.flags, 2), 2, 1, decode(s.lists, 0, 1, s.lists))),
decode(bitand(ts.flags, 32), 32, to_number(NULL),
decode(bitand(o.flags, 2), 2, 1, decode(s.groups, 0, 1, s.groups))),
decode(bitand(t.property, 32+64), 0,
decode(bitand(t.flags, 32), 0, 'YES', 'NO'), null),
decode(bitand(t.flags,1), 0, 'Y', 1, 'N', '?'),
t.rowcnt,
decode(bitand(t.property, 64), 0, t.blkcnt, null),
decode(bitand(t.property, 64), 0, t.empcnt, null),
decode(bitand(t.property, 64), 0, t.avgspc, null),
t.chncnt, t.avgrln, t.avgspc_flb,
decode(bitand(t.property, 64), 0, t.flbcnt, null),
lpad(decode(t.degree, 32767, 'DEFAULT', nvl(t.degree,1)),10),
lpad(decode(t.instances, 32767, 'DEFAULT', nvl(t.instances,1)),10),
lpad(decode(bitand(t.flags, 8), 8, 'Y', 'N'),5),
decode(bitand(t.flags, 6), 0, 'ENABLED', 'DISABLED'),
t.samplesize, t.analyzetime,
decode(bitand(t.property, 32), 32, 'YES', 'NO'),
decode(bitand(t.property, 64), 64, 'IOT',
decode(bitand(t.property, 512), 512, 'IOT_OVERFLOW',
decode(bitand(t.flags, 536870912), 536870912, 'IOT_MAPPING', null
))),
decode(bitand(o.flags, 2), 0, 'N', 2, 'Y', 'N'),
decode(bitand(o.flags, 16), 0, 'N', 16, 'Y', 'N'),
decode(bitand(t.property, 8192), 8192, 'YES',
decode(bitand(t.property, 1), 0, 'NO', 'YES')),
decode(bitand(o.flags, 2), 2, 'DEFAULT',
decode(s.cachehint, 0, 'DEFAULT', 1, 'KEEP', 2, 'RECYCLE', NULL)),
decode(bitand(t.flags, 131072), 131072, 'ENABLED', 'DISABLED'),
decode(bitand(t.flags, 512), 0, 'NO', 'YES'),
decode(bitand(t.flags, 256), 0, 'NO', 'YES'),
decode(bitand(o.flags, 2), 0, NULL,
decode(bitand(t.property, 8388608), 8388608,
'SYS$SESSION', 'SYS$TRANSACTION')),
decode(bitand(t.flags, 1024), 1024, 'ENABLED', 'DISABLED'),
decode(bitand(o.flags, 2), 2, 'NO',
decode(bitand(t.property, 2147483648), 2147483648, 'NO',
decode(ksppcv.ksppstvl, 'TRUE', 'YES', 'NO'))),
decode(bitand(t.property, 1024), 0, null, cu.name),
decode(bitand(t.flags, 8388608), 8388608, 'ENABLED', 'DISABLED'),
decode(bitand(t.property, 32), 32, null,
decode(bitand(s.spare1, 2048), 2048, 'ENABLED', 'DISABLED')),
decode(bitand(o.flags, 128), 128, 'YES', 'NO')
from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,
sys.obj$ cx, sys.user$ cu, x$ksppcv ksppcv, x$ksppi ksppi
where o.owner# = u.user#
and o.obj# = t.obj#
and bitand(t.property, 1) = 0
and bitand(o.flags, 128) = 0
and t.bobj# = co.obj# (+)
and t.ts# = ts.ts#
and t.file# = s.file# (+)
and t.block# = s.block# (+)
and t.ts# = s.ts# (+)
and (o.owner# = userenv('SCHEMAID')
or o.obj# in
(select oa.obj#
from sys.objauth$ oa
where grantee# in ( select kzsrorol
from x$kzsro
)
)
or /* user has system privileges */
exists (select null from v$enabledprivs
where priv_number in (-45 /* LOCK ANY TABLE */,
-47 /* SELECT ANY TABLE */,
-48 /* INSERT ANY TABLE */,
-49 /* UPDATE ANY TABLE */,
-50 /* DELETE ANY TABLE */)
)
)
and t.dataobj# = cx.obj# (+)
and cx.owner# = cu.user# (+)
and ksppi.indx = ksppcv.indx
and ksppi.ksppinm = '_dml_monitoring_enabled'
如您所见,那里引用了许多表,包括 SYS.OBJ$。现在您可以查找这些索引:
SQL> select index_name from all_indexes where table_name='OBJ$' and owner='SYS';
INDEX_NAME
------------------------------
I_OBJ1
I_OBJ2
I_OBJ3
等等。
于 2010-02-26T10:23:48.803 回答
1
为了标记 Tony Andrew 的答案,数据字典中的许多表都存储在 B*tree 集群中:
(作为 sys 作为 sysdba)
SQL> SELECT TABLE_NAME, CLUSTER_NAME FROM USER_TABLES
1 WHERE CLUSTER_NAME IN (SELECT CLUSTER_NAME FROM USER_CLUSTERS)
2 ORDER BY CLUSTER_NAME;
TABLE_NAME CLUSTER_NAME
------------------------------ ------------------------------
CCOL$ C_COBJ#
CDEF$ C_COBJ#
UET$ C_FILE#_BLOCK#
SEG$ C_FILE#_BLOCK#
SLOG$ C_MLOG#
MLOG$ C_MLOG#
VIEWTRCOL$ C_OBJ#
ICOLDEP$ C_OBJ#
LIBRARY$ C_OBJ#
OPQTYPE$ C_OBJ#
REFCON$ C_OBJ#
NTAB$ C_OBJ#
TYPE_MISC$ C_OBJ#
ATTRCOL$ C_OBJ#
SUBCOLTYPE$ C_OBJ#
COLTYPE$ C_OBJ#
LOB$ C_OBJ#
TAB$ C_OBJ#
CLU$ C_OBJ#
COL$ C_OBJ#
ICOL$ C_OBJ#
IND$ C_OBJ#
HISTGRM$ C_OBJ#_INTCOL#
RGROUP$ C_RG#
RGCHILD$ C_RG#
TYPE$ C_TOID_VERSION#
PARAMETER$ C_TOID_VERSION#
ATTRIBUTE$ C_TOID_VERSION#
RESULT$ C_TOID_VERSION#
METHOD$ C_TOID_VERSION#
COLLECTION$ C_TOID_VERSION#
FET$ C_TS#
TS$ C_TS#
TSQ$ C_USER#
USER$ C_USER#
SMON_SCN_TIME SMON_SCN_TO_TIME
因此,例如,列上的FET$
(空闲范围)和$TS
(表空间)都有一个“未记录的”索引TS#
。
于 2010-02-26T15:27:14.817 回答