【问题标题】:How to force oracle to not to use an index如何强制 oracle 不使用索引
【发布时间】:2013-06-13 01:25:21
【问题描述】:

我有一个要求,我必须强制 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-02
          • 1970-01-01
          • 2012-01-29
          • 2019-10-07
          • 1970-01-01
          • 2017-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多