Oracle SQL-无法通过提示删除索引使用情况?
这是来自uni测试的挑战。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
要求是使用提示来解决它
我正在尝试完成一个查询,希望它使用嵌套循环而不使用索引。为此,我编写了查询:
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 || ''