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

时间:2016-12-20 15:01:56

标签: sql oracle hint

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

我正在尝试完成一个查询,我希望它使用嵌套循环和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;

2 个答案:

答案 0 :(得分:2)

您遇到语法错误。

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

  • no_index适用于单个表。

请尝试使用内部查询。

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

您可以删除其他任何内容

答案 1 :(得分: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并且无法在索引中找到它