如何在 Oracle 中获取有关索引和表所有者的信息?

Posted

技术标签:

【中文标题】如何在 Oracle 中获取有关索引和表所有者的信息?【英文标题】:How do I get information about an index and table owner in Oracle? 【发布时间】:2011-10-05 23:40:39 【问题描述】:

我想编写一个 select 语句来显示表用户索引的数据字典中存在的 index_name、table_name、table_owner 和唯一性。任何帮助都会很棒。我的问题是我无法找到如何显示 index_name 和表所有者。

SELECT owner, table_name   FROM dba_tables;

这提供了大部分。

【问题讨论】:

【参考方案1】:

根据docs,你可以这样做:

select INDEX_NAME, TABLE_OWNER, TABLE_NAME, UNIQUENESS from USER_INDEXES

select INDEX_NAME, TABLE_OWNER, TABLE_NAME, UNIQUENESS from ALL_INDEXES

如果你想要所有索引...

【讨论】:

很好,很谦虚!【参考方案2】:
 select index_name, column_name
 from user_ind_columns
 where table_name = 'NAME';

或者使用这个:

select TABLE_NAME, OWNER 
from SYS.ALL_TABLES 
order by OWNER, TABLE_NAME 

对于索引:

select INDEX_NAME, TABLE_NAME, TABLE_OWNER 
from SYS.ALL_INDEXES 
order by TABLE_OWNER, TABLE_NAME, INDEX_NAME

【讨论】:

【参考方案3】:

以下内容可能有助于满足您的需要:

SELECT
    index_owner, index_name, table_name, column_name, column_position
FROM DBA_IND_COLUMNS
ORDER BY
    index_owner, 
    table_name,
    index_name,
    column_position
    ;

对于我的用例,我希望 column_names 和它们在索引中的顺序(这样我可以在迁移到 AWS 后在不同的数据库引擎中重新创建它们)。以下是我使用的,以防其他人使用:

SELECT
    index_name, table_name, column_name, column_position
FROM DBA_IND_COLUMNS
WHERE
    INDEX_OWNER = 'FOO'
    AND TABLE_NAME NOT LIKE '%$%'
ORDER BY
    table_name,
    index_name,
    column_position
    ;

【讨论】:

【参考方案4】:

以下内容对我有帮助,因为我没有 DBA 访问权限,并且还想要列名。

见:https://dataedo.com/kb/query/oracle/list-table-indexes

select ind.table_owner || '.' || ind.table_name as "TABLE",
       ind.index_name,
       LISTAGG(ind_col.column_name, ',')
            WITHIN GROUP(order by ind_col.column_position) as columns,
       ind.index_type,
       ind.uniqueness
from sys.all_indexes ind
join sys.all_ind_columns ind_col
           on ind.owner = ind_col.index_owner
           and ind.index_name = ind_col.index_name
where ind.table_owner not in ('ANONYMOUS','CTXSYS','DBSNMP','EXFSYS',
       'MDSYS', 'MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS', 'ORDSYS',
       'SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM', 'TSMSYS','WK_TEST',
       'WKPROXY','WMSYS','XDB','APEX_040000','APEX_040200',
       'DIP', 'FLOWS_30000','FLOWS_FILES','MDDATA', 'ORACLE_OCM', 'XS$NULL',
       'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR', 'PUBLIC',
       'LBACSYS', 'OUTLN', 'WKSYS', 'APEX_PUBLIC_USER')
    -- AND ind.table_name='TableNameGoesHereIfYouWantASpecificTable'
group by ind.table_owner,
         ind.table_name,
         ind.index_name,
         ind.index_type,
         ind.uniqueness 
order by ind.table_owner,
         ind.table_name;

【讨论】:

【参考方案5】:

我将复制类似问题Oracle - How to obtain information on index fields etc的答案

显示表格、索引和逗号分隔的索引列列表的脚本

set pagesize 50000
set linesize 32000
col table_name format a30
col index_name format a30
col primary_key_name format a30
col uniqueness format a10
col columns format a200

select ui.table_name,
       ui.index_name,
       uc.constraint_name as primary_key_name,
       ui.uniqueness,
       listagg(aic.column_name, ', ') within group (order by aic.column_position) as columns
from user_indexes ui
inner join all_ind_columns aic on aic.index_name = ui.index_name
left outer join user_constraints uc on uc.index_name = ui.index_name and uc.constraint_type = 'P'
group by ui.table_name, ui.index_name, ui.uniqueness, uc.constraint_name
order by table_name;

结果:

TABLE_NAME                     INDEX_NAME                     PRIMARY_KEY_NAME               UNIQUENESS COLUMNS                                 
------------------------------ ------------------------------ ------------------------------ ---------- ----------------------------------------
ACTIVEMQ_ACKS                  ACTIVEMQ_ACKS_PK               ACTIVEMQ_ACKS_PK               UNIQUE     CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY
ACTIVEMQ_ACKS                  ACTIVEMQ_ACKS_XIDX                                            NONUNIQUE  XID                                     
ACTIVEMQ_CONNECTION            ACTIVEMQ_CONNECTION_NAME_UK                                   UNIQUE     NAME                                    
ACTIVEMQ_CONNECTION            ACTIVEMQ_CONNECTION_PK         ACTIVEMQ_CONNECTION_PK         UNIQUE     ID                                      
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_CIDX                                            NONUNIQUE  CONTAINER                               
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_EIDX                                            NONUNIQUE  EXPIRATION                              
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_MIDX                                            NONUNIQUE  MSGID_PROD, MSGID_SEQ                   
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_PIDX                                            NONUNIQUE  PRIORITY                                
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_PK               ACTIVEMQ_MSGS_PK               UNIQUE     ID                                      
ACTIVEMQ_MSGS                  ACTIVEMQ_MSGS_XIDX                                            NONUNIQUE  XID                                     
ACT_EVT_LOG                    SYS_C00444651                  SYS_C00444651                  UNIQUE     LOG_NR_                                 
ACT_GE_BYTEARRAY               ACT_IDX_BYTEAR_DEPL                                           NONUNIQUE  DEPLOYMENT_ID_                          
ACT_GE_BYTEARRAY               SYS_C00444634                  SYS_C00444634                  UNIQUE     ID_                                     
ACT_GE_PROPERTY                SYS_C00444632                  SYS_C00444632                  UNIQUE     NAME_                                   
ACT_HI_ACTINST                 ACT_IDX_HI_ACT_INST_END                                       NONUNIQUE  END_TIME_                               
ACT_HI_ACTINST                 ACT_IDX_HI_ACT_INST_EXEC                                      NONUNIQUE  EXECUTION_ID_, ACT_ID_                  
ACT_HI_ACTINST                 ACT_IDX_HI_ACT_INST_PROCINST                                  NONUNIQUE  PROC_INST_ID_, ACT_ID_  

【讨论】:

【参考方案6】:

以下是两个简单的查询,您可以使用它们检查在 Oracle 中的表上创建的索引。

select index_name
  from dba_indexes
 where table_name='&TABLE_NAME'
   and owner='&TABLE_OWNER';
select index_name 
  from user_indexes 
 where table_name='&TABLE_NAME';

请在下方查看更多详细信息和索引大小。 Index on a table and its size in Oracle

【讨论】:

以上是关于如何在 Oracle 中获取有关索引和表所有者的信息?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE11g 反复插数据删数据,删索引建索引,对数据文件和表空间有啥影响

如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?

如何在 Oracle 中动态分析给定模式名和表名的元数据?

Oracle18获取数据库当前用户下所有表名和表名的注释

oracle学习篇十二:索引

如何通过 JDBC 获取 Oracle 表中的所有索引,即使它们由不同的用户拥有?