Search code examples
oracle-databaseindexingdata-dictionary

What indexes are on the oracle data dictionary tables


How can I find out what, if any, indexes are set up on the oracle data dictionary tables themselves (eg on the columns of all_tables or all_source)?


Solution

  • ALL_TABLES and ALL_SOURCE are actually views. If you have the privileges you can view the source of them:

    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'
    

    As you can see, there are many tables referenced there, including SYS.OBJ$. Now you can look up the indexes on those:

    SQL> select index_name from all_indexes where table_name='OBJ$' and owner='SYS';
    
    INDEX_NAME
    ------------------------------
    I_OBJ1
    I_OBJ2
    I_OBJ3
    

    and so on.