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) であるインデックスに限定したい場合があります。または、その特定の列のインデックスだけに制限したい場合があります ( COLUMN_POSITION2 に列がないように)。

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 に答える