5

存在其他人加载的表。我需要对表进行查询,但是缺少索引使得查询计划很糟糕。我想要做的是检测是否有特定列的索引,以便如果它不存在我可以创建它,如果它已经存在则不创建它。

谢谢。

邪恶的

4

2 回答 2

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) 的索引。或者您可能希望将自己限制为仅在该特定列上的索引(以便在 2 中没有列COLUMN_POSITION),即

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
于 2008-11-20T21:24:12.507 回答
1

熟悉查询 SYS 模式:

Select * from sys.all_ind_columns where table_name=:TabName and table_owner=:TabOwner;
于 2008-11-20T21:19:31.593 回答