テーブルに存在する特定のインデックスを使用しないようにSQLを強制する必要があるという要件があります。
例えば、
create table t1(id varhcar2(10),data1 varchar2(3000));
create table t2(id varhcar2(10),data2 varchar2(3000));
create index id1 on t1(id);
select * from t1,t2 where t1.id=t2.id;
インデックスid1を削除することはできません。また、権限がないため、削除することもできません。したがって、使用を避けるために何らかのヒントを追加したいと思います。
そのようなヒントはありますか、またはこれに対する回避策はありますか?.
前もって感謝します
nO_INDEXヒントを使用する
http://docs.Oracle.com/cd/B19306_01/server.102/b14200/sql_elements006.htm#BABHJBIB
例えば
SELECT /*+ NO_INDEX(t1 id1) */
FROM t1,
t2
WHERE t1.id = t2.id;
関数を適用することにより、ヒントのない列でのインデックスの使用を防ぐことができます。列の値が変更されないように、「no-op」関数を使用することをお勧めします。数値の場合、これはゼロを追加する可能性があり、文字列の場合、空の文字列を追加します。
select * from t1,t2 where t1.id || '' =t2.id;
実行プランを指定するすべてのクエリには、テーブルごとに2つまたは3つのヒントのようなものが必要であるという一般原則があります。
この場合、おそらく2つの全表スキャンの結果であるハッシュ結合を探しています。これはかなり単純なので、ヒントブロックは次のようになります。
select /*+ full(t1) full(t2) use_hash(t1 t2) */
...