他の誰かがロードしたテーブルが存在します。テーブルに対してクエリを実行する必要がありますが、インデックスがないためクエリ プランがうまくいきません。私がしたいのは、特定の列のインデックスがあるかどうかを検出して、存在しない場合は作成し、既に存在する場合は作成しないようにすることです。
ありがとう。
悪の
クエリを実行できます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
SYS スキーマのクエリに慣れる:
Select * from sys.all_ind_columns where table_name=:TabName and table_owner=:TabOwner;