如何强制oracle不使用索引

问题描述 投票:0回答:4

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

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

提前致谢

sql oracle query-performance hints
4个回答
15
投票

尝试使用NO_INDEX提示

比如说

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

4
投票

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

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

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

3
投票

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

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


0
投票

选择 DTH_INIT_SOL_ID、LCHG_TIME、TRAN_ID、ENTRY_USER_ID、TRAN_AMT、TRAN_PARTICULAR、TRAN_DATE、PART_TRAN_SRL_NUM、 TRAN_TYPE、TRAN_SUB_TYPE、PART_TRAN_TYPE 来自 TBAADM.DTD,其中 PSTD_FLG = 'N' AND DEL_FLG = 'N' AND TRAN_DATE = '2024 年 7 月 9 日' 按 LCHG_TIME ASC 排序;

© www.soinside.com 2019 - 2024. All rights reserved.