2008-11-20 44 views
5

存在其他人加载的表。我需要对表进行查询,但缺乏索引使查询计划变得糟糕透顶。我想要做的是检测是否存在某个特定列的索引,以便我可以在不存在的情况下创建该索引,如果它已经存在,则不创建它。如何检测Oracle中某个表上是否存在索引?

谢谢。

邪恶

回答

7

可以查询DBA_/ALL_/USER_IND_COLUMNS,即

SQL> SELECT index_name 
    2 FROM dba_ind_columns 
    3 WHERE table_owner = 'SCOTT' 
    4  AND table_name = 'EMP' 
    5  AND column_name = 'EMPNO'; 

INDEX_NAME 
------------------------------ 
PK_EMP 

当然,你可能会想扩展查询了一下。这将拾取EMPNO列出现的任何索引。您可能想限制自己的索引,其中列是索引的前导列(COLUMN_POSITION = 1)。或者,您可能想限制自己仅限于该特定列的索引(以便COLUMN_POSITION 2中没有列),即

SQL> ed 
Wrote file afiedt.buf 

    1 SELECT index_name 
    2 FROM dba_ind_columns a 
    3 WHERE table_owner = 'SCOTT' 
    4  AND table_name = 'EMP' 
    5  AND column_name = 'EMPNO' 
    6  AND column_position = 1 
    7  AND NOT EXISTS(SELECT 1 
    8      FROM dba_ind_columns b 
    9      WHERE a.index_owner = b.index_owner 
10      AND a.index_name = b.index_name 
11*      AND b.column_position = 2) 
SQL>/

INDEX_NAME 
------------------------------ 
PK_EMP 
1

熟悉查询SYS模式:

Select * from sys.all_ind_columns where table_name=:TabName and table_owner=:TabOwner; 
相关问题