如何强制oracle不使用索引

时间:2013-06-17 06:34:00

标签: sql oracle query-performance hints

我有一个要求,我必须强制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,也不能删除它,因为我没有权限。因此我想添加一些提示以避免使用它。

是否有任何此类提示,或者是否有任何解决方法。

提前致谢

3 个答案:

答案 0 :(得分:10)

使用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;

答案 1 :(得分:3)

一般原则是,对于要为其指定执行计划的每个查询,每个表需要两个或三个提示。

在这种情况下,您可能正在寻找由两次全表扫描产生的散列连接,这非常简单,因此提示块将类似于:

select /*+ full(t1) full(t2) use_hash(t1 t2) */
...

答案 2 :(得分:3)

通过对其应用函数,可以防止在没有提示的列上使用索引。您将需要使用“无操作”功能,因此不会更改列值。对于数字,对于附加空字符串的字符串,这可能会加零:

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