2016-12-20 25 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張貼:-) –