Oracle SQL-无法通过提示删除索引使用情况?

Oracle SQL-无法通过提示删除索引使用情况?,sql,oracle,hint,Sql,Oracle,Hint,这是来自uni测试的挑战。 要求是使用提示来解决它 我正在尝试完成一个查询,希望它使用嵌套循环而不使用索引。为此,我编写了查询: select /*+ USE_NL(fulltable) NO_INDEX(fulltable) */ sum(QUANTITY) summarized from (select /*+ USE_NL(sz1, sz2, c1) NO_INDEX(sz1, sz2, c1) */ distinct * from SZTABLE sz1

这是来自uni测试的挑战。
要求是使用提示来解决它


我正在尝试完成一个查询,希望它使用嵌套循环而不使用索引。为此,我编写了查询:

select /*+ USE_NL(fulltable) NO_INDEX(fulltable) */  sum(QUANTITY) summarized from
    (select /*+ USE_NL(sz1, sz2, c1) NO_INDEX(sz1, sz2, c1) */ distinct *     
     from SZTABLE sz1 
          natural join SZTABLE2 sz2
          natural join CTABLE c1
          where city= 'Newark' and COLOR= 'red') fulltable;
然而,在解释并写出查询后,我得到:

SELECT STATEMENT +  + 
  SORT + AGGREGATE + 
    VIEW +  + 
      HASH + UNIQUE + 
        NESTED LOOPS +  + 
          NESTED LOOPS +  + 
            HASH JOIN +  + 
              JOIN FILTER + CREATE + :BF0000
                TABLE ACCESS + FULL + CTABLE
              VIEW +  + VW_DTP_5C333E12
                HASH + UNIQUE + 
                  JOIN FILTER + USE + :BF0000
                    TABLE ACCESS + FULL + SZTABLE
            INDEX + UNIQUE SCAN + SZO_SZKOD
          TABLE ACCESS + BY INDEX ROWID + SZTABLE2
显然,查询仍然使用索引,尽管我明确要求它不要这样做。我怎样才能解决这个问题?为什么还有用于ROWID的索引和索引

(计划是由下面的片段写出来的。)


你有语法错误

  • use_nl要求多个表之间用空格而不是逗号分隔

  • 没有索引在单个表上工作

请尝试内部查询

use_nl(sz1 sz2 c1) no_index(sz1) no_index(sz2) no_index(c1)

您可以删除任何其他奇怪的问题,但您可以在涉及查询的表上获取所有索引并执行以下操作:

alter index <Index_Name> unusable
看看组合

z1.id+0 
city || ''

结果相同,但CBO查看expr,在索引中找不到它

我强烈建议您不要使用
自然连接
。这使得查询很难理解,因为连接键不清楚。我理解,但这不是问题的重点。我想知道为什么我不能让索引的使用消失。请发布你的表的结构。你想解决什么问题?根据源问题,可能存在更优雅的解决方案。您可以尝试
alterindex\u name隐形-只要不要求您使用提示。TBH这是uni的一个测试问题,我应该使用嵌套循环而不使用索引。所以这并不能真正回答问题。谢谢你的支持。我指的是uni测试,而不是这篇文章:-)我仍然得到
索引+范围扫描+SZT_SZKOD
表访问+按索引ROWID+SZTABLE2
我想你说过解决方案应该使用提示。有机会测试更新后的答案吗?是的,我知道,这是在大学的一次测试中,我们应该通过使用提示来解决这个问题。@lte\uuuuuuu提示smt无法捕获。您能稍微修改一下查询吗?是指重写连接条件还是谓词?
select sum(QUANTITY) summarized from
    (select distinct *     
     from SZTABLE sz1 
          join SZTABLE2 sz2 on sz1.id+0 = sz2.id+0 --put your join condition, cause I don't know you table columns
          join CTABLE c1 on c.id+0 = sz2.id+0 --put your join condition
          where city || ''= 'Newark' and COLOR|| ''= 'red') fulltable;
z1.id+0 
city || ''