web-dev-qa-db-ja.com

Oracleにインデックスを使用しないように強制する方法

テーブルに存在する特定のインデックスを使用しないように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を削除することはできません。また、権限がないため、削除することもできません。したがって、使用を避けるために何らかのヒントを追加したいと思います。

そのようなヒントはありますか、またはこれに対する回避策はありますか?.

前もって感謝します

8
Fr_nkenstien

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;
12
Dmitry Bychenko

関数を適用することにより、ヒントのない列でのインデックスの使用を防ぐことができます。列の値が変更されないように、「no-op」関数を使用することをお勧めします。数値の場合、これはゼロを追加する可能性があり、文字列の場合、空の文字列を追加します。

select * from t1,t2 where t1.id || '' =t2.id;

3
Chris Saxon

実行プランを指定するすべてのクエリには、テーブルごとに2つまたは3つのヒントのようなものが必要であるという一般原則があります。

この場合、おそらく2つの全表スキャンの結果であるハッシュ結合を探しています。これはかなり単純なので、ヒントブロックは次のようになります。

select /*+ full(t1) full(t2) use_hash(t1 t2) */
...
3
David Aldridge