如何强制oracle不使用索引

fae0ux8s  于 2023-05-28  发布在  Oracle
关注(0)|答案(3)|浏览(454)

我有一个要求,我必须强制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,也不能删除它,因为我没有对它的权利。因此,我想添加一些提示,以避免使用它..
有没有这样的提示,或者有没有解决办法。
先谢谢你了

gywdnpxw

gywdnpxw1#

尝试使用NO_INDEX提示
比如说

SELECT /*+ NO_INDEX(t1 id1) */ 
  FROM t1,
       t2  
 WHERE t1.id = t2.id;
nnt7mjpx

nnt7mjpx2#

有一个一般原则,对于要指定执行计划的每个查询,每个表都需要两个或三个提示。
在这种情况下,您可能正在寻找由两次全表扫描产生的散列连接,这相当简单,因此提示块将类似于:

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

euoag5mw3#

您可以通过对列应用一个函数来防止在没有提示的情况下对该列使用索引。您需要使用一个“no-op”函数,这样列的值就不会被更改。对于数字,这可能是添加零,对于字符串,附加空字符串:
select * from t1,t2 where t1.id || '' =t2.id;

相关问题