2010-11-09 157 views
2

我有90萬條記錄的表(MEN)。oracle 11g問題索引

在這張表中我有字段IPTdate

當我運行查詢:

select * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY') 

需要很長的時間,直到我得到的結果。

我儘量讓指數是這樣的:

create index 
    my_in 
on 
    MEN (IP,Tdate); 

但如何運行查詢得到快速的結果?

我試試這個:

select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY') 

,並得到錯誤:ORA-00904

回答

5

您不使用select中的索引名稱(My_in)。數據庫本身會計算出使用索引。所以你應該像你的第一個例子一樣做選擇。

+0

好的,如果我有一個索引例如在MEN(IP)上創建索引 my_in2; oracle如何知道使用哪個索引? – Gold 2010-11-09 14:58:22

+4

它會選擇一個它認爲最好的。它通過查看錶的統計數據來確定這一點,這就是爲什麼有時必須更新表/索引的統計信息才能使用正確的索引。 – 2010-11-09 15:01:09

1

這不是有效的SQL。 My_in是您的索引的名稱。

與再試一次:

select * 
    from MEN 
where IP = '1.1.1.1' 
    and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY'); 

另外,如果你想知道,如果服務器將使用新創建的索引使用計劃,你可以檢查explain命令的輸出:

explain plan for 
select * 
    from MEN 
where IP = '1.1.1.1' 
    and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY'); 

查看關於EXPLAIN PLAN的Oracle文檔。它會幫助你進行這個和許多其他的SQL優化。

+1

+1用於繪製注意'解釋plan',但它應該是'對於選擇解釋計劃*從MEN ...'後面跟'select * from table(dbms_xplan.display())'或類似的。 – 2010-11-09 15:44:55

1

在查詢

select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY') 

的my_in是索引名。如果要強制使用索引,那麼你就可以提示你的查詢

select /*+INDEX(My_in MEN) */ * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY') 
+1

+1,但大多數時候提示不是必需的(甚至可能導致查詢運行速度變慢),應該避免。 – 2010-11-10 01:25:20