2013-04-30 66 views
1

當我查詢我的表像這樣的特定對象,我會得到一個空的結果集:Oracle索引行爲

SELECT 
    a, b, c, valid_to, pk_mykey, myobject 
FROM 
    myschema.mytable 
WHERE 
    valid_to = to_date('31.12.9999 23:59:59', 'dd.mm.yyyy hh24:mi:ss') 
AND 
    pk_mykey > 0 
AND 
    myobject = 'ABC.123'; 

但我知道的記錄必須是在表中!

所以我用這個查詢,它會突然出現:

SELECT 
    /*+ NO_INDEX(mytable myindex) */ 
    a, b, c, valid_to, pk_mykey, myobject 
FROM 
    myschema.mytable 
WHERE 
    valid_to = to_date('31.12.9999 23:59:59', 'dd.mm.yyyy hh24:mi:ss') 
AND 
    pk_mykey > 0 
AND 
    myobject = 'ABC.123'; 

因此,通過使用該記錄不會顯示指數,但沒有索引它會?這怎麼可能?我在這裏錯過了什麼?我的表格和/或我的索引有什麼問題?任何想法如何我可以解決這個問題?

(DBMS是的Oracle 11g EE 11.2.0.2.0 64位)

+0

什麼是差異b/w的2個查詢? – 2013-04-30 09:19:58

+0

@ ling.s:'NO_INDEX'提示 – 2013-04-30 09:30:57

+0

@ ling.s:是的,正是a_horse_with_no_name所說的提示。 query1根本不給我任何記錄。 query2恰好爲1條記錄(因爲它應該是)其中myobject ='ABC.123'且其他條件適用 – BaseBallBatBoy 2013-04-30 10:00:53

回答

3

您已確認有在執行計劃的差異?

如果您在使用和不使用索引時得到不同的結果,那麼我會考慮刪除索引並重新創建它。不要只重建索引,因爲新的細分將基於舊數據,並且如果確實存在無法解決問題的損壞問題。

+0

是,query1使用索引(唯一掃描)。 query2執行全表掃描,不包括索引。 – BaseBallBatBoy 2013-04-30 09:54:13

+0

這是myobject和valid_to上的索引嗎? – 2013-04-30 10:39:09

+0

,myobject和valid_to上的唯一索引。所有索引(myschema_idx)都有一個表空間,所有表(myschema_tbl)都有一個表空間。 – BaseBallBatBoy 2013-04-30 10:54:19

-1

理論上,由於某些Oracle錯誤,您的索引內容可能會「無效」。這可能發生在一些早期的RAC版本上。 嘗試執行該語句

ALTER TABLE myschema.mytable VALIDATE STRUCTURE CASCADE; 

這將「交叉檢查」表內容針對它的索引。或者嘗試重建索引。

+1

你不是指ANALYZE TABLE嗎?如果是這樣,我不是DBA,因此沒有運行這種查詢的權限...... – BaseBallBatBoy 2013-04-30 11:16:35

+0

它是「alter table」的非破壞性聲明,即使在prod系統上也可以「安全」執行。它只會產生大量的IO。如果交叉檢查失敗,將在udump_dest中創建轉儲文件。該命令不需要DBA專有權,也可以作爲模式所有者執行它。 – ibre5041 2013-04-30 11:23:24

+0

'ORA-01735:無效的ALTER TABLE選項' – 2013-05-01 22:34:54