2016-12-20 26 views
1

这是来自uni测试的挑战。
需求是使用提示来解决它。Oracle SQL - 无法通过提示删除索引使用情况?


我想完成一个查询,我希望它使用嵌套循环和NO指数。对于这一点,我写的查询:

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?

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

SELECT LPAD(' ', 2*(level-1))||operation||' + '||options||' + '||object_name terv 
FROM plan_table 
START WITH id = 0 AND statement_id = 'plan1' 
CONNECT BY PRIOR id = parent_id AND statement_id = 'plan1' 
ORDER SIBLINGS BY position; 
+3

我会强烈建议您不要使用'自然join'无法找到它。它使得查询非常难以理解,因为连接键不清晰。 –

+0

我明白,但这不是问题的关键。我想知道为什么我不能使索引使用消失。 –

+1

请发表您的表格结构 – Aleksej

回答

0

奇怪的问题,但你可以得到你所有的指数涉及到查询表并执行此:

alter index <Index_Name> unusable 

或重写查询

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 || '' 

结果是相同的,但CBO看到EXPR和指数

+0

是的,我知道,它在uni测试中,我们应该通过使用提示来解决这个问题。 –

+0

@lte__提示smt不能被捕获。你可以修改一下查询吗?意味着重写连接条件或谓词? –

+0

当然,你有什么想法? –

2

你有语法错误。

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

  • no_index在单个表上工作。

请尝试,为内部查询。

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

您可以删除任何东西

+0

TBH这是uni的一个测试问题,我应该使用嵌套循环并且没有索引。所以这并没有真正回答这个问题。 –

+0

谢谢你的支持。 –

+1

我指的单向测试不是这个SO张贴:-) –